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

이진규·2022년 1월 26일
1

프로그래머스(PYTHON)

목록 보기
28/64

문제

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

나의 코드 (답안참조)

"""
1. 아이디어
리스트 안에 숫자들을 문자열로 바꿔준다음 3을 곱해 내림차순으로 정렬한 다음
return 하기 전에 join을 이용해서 붙여준다.

2. 시간복잡도
O(nlogn) - 정렬 시간복잡도만 신경쓰면 되지 않을까?
"""

def solution(numbers):
    
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x : x*3, reverse=True)
    
    # 위의 정렬과 밑의 주석처리 된 정렬식은 같은 것이다.
    # numbers = sorted(numbers, key = lambda x : x*4, reverse=True)
    
    # ★ int 해주는 이유 : '0000'일때 '0'이 나오도록 해야함. ★
    return str(int(''.join(numbers)))
    

느낀점

위에서 3을 곱해주는 이유는 다음과 같다.

입출력 예2 [3, 30, 34, 5, 9] 에서 숫자인 상태에서 내림차순 정렬을 해준다면
[34, 30, 9, 5, 3] 이렇게 될 것이다. 하지만 이렇게 해서는 가장 큰 수를 만들기 힘들다.

그래서 이를 문자열로 변경한다음 내림차순으로 정렬을 한다면 [9, 5, 34, 30, 3] 이렇게 될 것이다. 이렇게 나오는 이유는 문자열의 내림차순 정렬에서는 첫번째 인덱스 부터 아스키코드로 값을 비교하고 만약 첫번째 인덱스의 값이 서로 같다면 두번째 값의 인덱스 비교 그 다음은 세번째 이렇게 비교를 해 나가므로 위의 값 처럼 정렬된다. 하지만 제일 큰 수를 만들려면 [9, 5, 34, 3, 30] 이렇게 와야 한다.

이때 3과 30을 어떻게 하면 위치를 바꿀 수 있을지 고민해야 하는데 이때 3을 곱해주면 해결이 된다. (numbers의 원소는 0이상 1000이하라고 했으므로 문자열에 3을 곱해준다. 만약 10000이하라면 4를 곱하고, 100000이하라면 5를 곱함)

결국 3을 곱하면 [333, 303030, 343434, 555, 999] 이렇게 될 것이고 이 기준으로 내림차순 정렬을 하면 [999, 555, 343434, 333, 303030]이 될 것이고 람다식을 이용해서 정렬 기준만 제공한 것이므로 마지막에는 [9, 5, 34, 3, 30] 이렇게 반환 될 것이다!

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글