728x90
어려운 문제였다. 순열로 생각해서 모든 경우를 다 고민하면 된다고 생각했지만 시간 초과에 걸렸다.
주의점!
- [0, 0, 0, 0]을 정렬할 때 '가장 큰 수'를 구해야 하므로 0이 나와야 한다.
- 문자열로 출력해야 한다.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x : x*3, reverse=True)
return str(int(''.join(numbers)))
두 번째 예시가 문제다.
[3, 30, 34, 5, 9]
"9534330"
파이썬 문자열을 큰 순서대로 정렬하면 문자열은 앞자리가 큰 순서대로 정렬되므로 9, 5, 34, 30, 3 이 된다. 하지만 3이 30보다 먼저와야 한다.
파이썬에서 문자열에 *연산을 하면
'3' * 2
>>> '33'
'6'이 아닌 '33'이 된다.
범위가 1~1000 사이의 숫자라는 점을 기억하자. 그래서 3을 곱하면 [ '333', '303030', '343434', '555', '999'] 가 된다.
이 순서로 문자열 내림차순 정렬하면 '9534330'이 된다.
추가적으로 *2 하면 안되는 이유는 [9, 991]일때 *2를 하면 99, 991991로 991이 더 앞에 정렬 되기 때문이다.
가장 큰 수를 찾으려면 9991이 되어야 하는데 9919가 된다.
반면에 *3을 하면 999, 991991991로 세번째 숫자에서 9와 1이 만나므로 이 순서대로 정렬하면 9991이 된다.
그리고 [0, 0, 0, 0]인 경우 결과 값이 0이 나와야 한다.
그래서 ''.join(numbers)에서 '0000'을 int()로 0으로 만들고 다시 문자열로 만들어 줘야 한다.
마지막 str()을 해주지 않으면 3번째 제한사항인 문자열로 return한다에서 걸리기 때문이다.
이전에 문자열 문제 엄청 풀었는데 다 까먹었다. 리스트 내용을 전부 문자열로 바꿔주는 list(map(str, numbers))도 기억이 안났는데 다시 풀면서 복기하기 좋은 문제라고 생각한다.
728x90
'[Coding Test] > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] lv1 완주하지 못한 선수 / 파이썬, 고득점kit (0) | 2023.10.04 |
---|---|
[프로그래머스] lv1 폰켓몬 / 파이썬, 고득점kit (0) | 2023.10.04 |
[프로그래머스] lv1 K번째수 / 파이썬, 고득점kit (0) | 2023.10.03 |
[프로그래머스] lv3 아이템 줍기 / 파이썬 [해설과 다른 풀이], 고득점kit (0) | 2023.09.08 |
[프로그래머스] lv3 단어 변환 / 파이썬, 고득점kit (0) | 2023.09.07 |