본문 바로가기

Python/코딩 테스트 해설집

프로그래머스 - 정렬 - 가장 큰 수

반응형

1. 문제의 출처 - 프로그래머스 - 정렬 - K번째 수

 

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

 

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

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

programmers.co.kr

 

 

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()) 과정을 한 번 더 거쳐준 것입니다. 

 

오늘도 성장하는 개발자가 되겠습니다!!

 

반응형