프로그래머스 Lv 2 문제 중 가장 큰 수 문제이다.
programmers.co.kr/learn/courses/30/lessons/42746
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 ..이 하나의 예외 케이스로 등장한다.
'알고리즘 & PS' 카테고리의 다른 글
[Python] 프로그래머스 Lv 3 - N으로 표현 (0) | 2021.04.21 |
---|---|
[Python] 프로그래머스 Lv 1 - 완주하지 못한 선수 (0) | 2021.04.21 |
[Python] 프로그래머스 Lv 2 - 큰 수 만들기 (0) | 2021.04.21 |
[알고리즘] Stack - 수식의 표현(수정) (0) | 2021.04.20 |
[Python] 프로그래머스 Lv 1. 나머지 한 점 (0) | 2021.04.20 |