본문 바로가기
알고리즘 & PS

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

by 다람이도토리 2021. 4. 21.

프로그래머스 Lv 2 문제 중 가장 큰 수 문제이다. 

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

 

코딩테스트 연습 - 가장 큰 수

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

programmers.co.kr

 

1. 나의 최초 풀이

그야말로 삽질 풀이이다.
원래 숫자와, 대소 비교를 위해 변환한 숫자를 리스트로 묶어서 정렬 후, 변환 숫자가 큰 순서대로 원래 숫자를 붙이는 알고리즘이다.

# 가장 큰 수 나의 정답
import math
def solution(numbers):
    answer = ''
    # 1단계. 자리수 맞추기
    numbers_string = list(map(str, numbers))
    # 자리수 맞추기.
    for i in range(len(numbers_string)):
        iters = 12 // len(numbers_string[i])
        numbers_string[i] = (numbers_string[i] * iters)
    numbers_adj = list(map(int, numbers_string))
    if sum(numbers_adj) == 0:  # 예외처리 요주의! 합이 0이면, 0이다!
        return '0'
    # 2단계. list화 해서 key값 기준으로 정렬하기, zip 활용
    d = list(zip(numbers_adj, numbers))
    d = sorted(d, key = lambda x : (-x[0], -x[1]))
    # 3단계. answer
    for i in range(len(d)):
            answer += str(d[i][1])
    
    return answer

 

2. 모범 풀이 / 배운 점

강의를 통해 배운 모범 답안이다.

# 가장 큰 수 : 모범답안 문제
# 복잡도 : 정렬하면서 O(NlogN)
def solutions(numbers):
    numbers = [str(x) for x in numbers]
    numbers.sort(key = lambda x : (x * 4)[:4], reverse = True)
    if numbers[0] == '0':
        answer = 0
    else:
        answer = ''.join(numbers)
    return answer

* 리스트 컴프리헨션을 잊지말자. map이니 할거없이 저렇게 한번에 str을 해버릴 수 있다.

* lambda로 지정하여 정렬 조건을 주면, 굳이 dict를 써서 할 필요 없이, 정렬 기준 만으로 원본 데이터를 정렬해 줄 수 있다. 원본이 바뀌지 않아 굳이 dict니 이중 list니 할 필요가 없던 것이다!

* join을 사용하여 리스트 내 문자열을 한번에 합쳐버릴 수 있다. 이젠 잊지말자. 

* 문제의 조건에서 나오는 예외 케이스를 놓치지 말자. 이 문제에서는 0 0 0 ..이 하나의 예외 케이스로 등장한다.