1. 문제의 출처 - 프로그래머스 - 정렬 - K번째 수
programmers.co.kr/learn/courses/30/lessons/42746
2. 문제의 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
3. 나의 해답
1
2
3
4
5
6
7
|
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort( key = lambda x: x*3 , reverse = True )
answer = str(int(''.join(numbers)))
return answer
|
cs |
(1) numbers = list(map(str, numbers))
우선 리스트 형태를 하나의 str 형태로 받아야 합니다. 그렇기에 map 함수를 활용했습니다.
map(함수, 인자)이기에 함수를 str로 쓰고, numbers를 인자로 받았습니다.
이 결과를 출력하면 ["6", "10", "2" ]로 되겠죠.
(2) numbers.sort( key = lambda x: x*3 , reverse = True)
파이썬 리스트에서는 내장함수 sort()가 있습니다. 처음에 저도 퀵정렬 버블 정렬 등을 활용해보려 했는데, 시공간 복잡도 때문에 빠꾸를 먹더군요.
sort()에서 중요한 기능이 있는데, 바로 정렬의 기준(Key)을 설정할 수 있다는 점입니다. 여기서 정렬의 기준을 바로 str인자에 반복적으로 곱하는 것이죠. 이렇게 하는 경우는 테스트 케이스 중에서 [3, 30] 때문에 그렇습니다.
현재 3과 30은 string 형태입니다. 이때 정렬을 reverse로 했을 때 순서가 "3" > "30"으로 인식합니다.
이러한 유사 케이스가 다른 테스트 케이스에 있을 수 있기 때문에 인자에 x*3으로 적용을 해주는 것입니다.
(3) answer = str(int(''.join(numbers)))
사실 ''.join(numbers)만 해도 될 줄 알았습니다. 왜인지 모르겠는데, 테스트 케이스 11번 이외 빼고는 다 정답이라고 하는데 꼭 거기서 막히더라구요.
그래서 str(int()) 과정을 한 번 더 거쳐준 것입니다.
오늘도 성장하는 개발자가 되겠습니다!!
'Python > 코딩 테스트 해설집' 카테고리의 다른 글
프로그래머스 - 해쉬 - 완주하지 못 한 선수 (0) | 2021.01.14 |
---|---|
백준 - 1920번 - 수 찾기 (0) | 2021.01.11 |
백준 - 10930번 - SHA 256 (0) | 2021.01.11 |
프로그래머스 - 정렬 - H-index (0) | 2021.01.11 |
프로그래머스 - 정렬 - K번째수 (0) | 2021.01.06 |