Algorithm/Programmers

[정렬] 프로그래머스 Lv.2 가장 큰 수 - Python

jyjyjy25 2024. 3. 16. 02:03

🗂️ 문제

링크: https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 접근법

numbers 리스트 내 값들의 자릿수를 3자리로 맞춘다. 자릿수를 맞출 때 부족한 자릿수만큼 첫 번째 자리에 해당하는 수로 채운다.

 numbers=[3, 30, 34, 5, 9] → numbers=[333, 303, 343, 555, 999]가 된다.

이를 정렬하면 numbers = [999, 555, 343, 333, 303]이다. 이것의 원래 값을 이어붙여서 출력하면 answer = “9534330”이다.

 

하지만 위의 해결방식에는 numbers=[3, 30, 303]라는 반례가 존재한다.

위의 방식대로 적용할 경우 정렬 결과는 numbers=[333, 303, 303]이 된다. 이때 동일한 값이 존재하기 때문에 우선순위를 지정해야 한다. 즉 원래 값을 두 번째 정렬 조건으로 지정한다. 즉 정렬 결과는 numbers=[333(3), 303(303), 303(30)]이다. 이를 출력하면 answers=”330330”이 된다.

 

하지만 이 방식 또한 numbers=[14, 141]라는 반례가 존재한다.

따라서 부족한 자릿수를 값의 첫 번째 자리로 채우는 것이 아니라 값을 3번 반복하는 방식을 통해 채워야 한다.

 numbers=[14, 141] → numbers=[141414, 141141141]이 되고, 이를 정렬하면 numbers=[141414, 141141141]이고 answer=”14141”이다.

 

😎 내 코드

  • 시도 1 - 반례: [3, 30, 303]
def solution(numbers):
    answer = ''
    
    new_n = []
    for num in numbers:
        s_num = str(num)
        digit4_num = s_num + s_num[0] * 3
        new_n.append((s_num, digit4_num))
    
    new_n.sort(key=lambda x: (x[1]), reverse=True) 
    
    for n in new_n:
        answer += n[0]
        
    return answer
  • 시도 2 - 반레: [14, 141]
def solution(numbers):
    answer = ''
    
    new_n = []
    for num in numbers:
        s_num = str(num)
        digit4_num = s_num + s_num[0] * 3
        new_n.append((s_num, digit4_num))
    
    new_n.sort(key=lambda x: (x[1], x[0]), reverse=True) 
    
    for n in new_n:
        answer += n[0]
        
    return answer

 

👀 배운 코드

def solution(numbers):
    answer = ''
    
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    answer = ''.join(numbers)
        
    return str(int(answer))

return 시 str(int(answer))을 하는 이유는 [0, 0]에 대한 반례를 해결하기 위함이다.

 

🧐 배운 점

  1. numbers 리스트 내 요소 str로 변환
    numbers = list(map(str, numbers))
  2. 정렬할 대상이 되는 리스트를 새로 생성하지 않고 lambda 식 안에서 정렬할 값을 생성한 뒤 정렬
    numbers.sort(key=lambda x: x*3, reverse=True)
  3. 리스트 내 문자열 하나로 합치기
    answer = ''.join(numbers)

 

🔗 Reference

 

[프로그래머스] 가장 큰 수(python)

문제 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장

liveloper-jay.tistory.com