알고리즘 공부를 위해, 정렬 공부를 진행하면서 프로그래머스의 한 문제를 접하였다. 바로 "가장 큰 수"라는 문제다. 이 문제에서 sort 함수의 기본적인 플롯을 알게되어 기록해보고자 한다. 그리고 sort함수를 사용하여 백준문제도 몇 개 풀어보면서 감을 잡아야지.
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
input | output |
---|---|
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | “9534330” |
[0, 0, 0, 0] | "0" |
Think 1) 문자열로 바꾸어 정렬
각 숫자의 첫번째자리가 큰 것이 앞으로 와야 큰수가 만들어진다.
하지만! 문제가 있다. 바로 예시 2번에서 보도록 하자
numbers = [3, 30, 34, 5, 9]
# map 함수로 numbers의 인자들을 문자화 하고, 따로 리스트로 만들었다.
numbers_str = list(map(str, numbers))
# 내림차순으로 정렬
numbers_str.sort(reverse=True)
#출력
['9', '5', '34', '30', '3']
1000 이하의 수가 들어가므로, 자릿수가 다른 숫자가 들어가면 원하는 결과를 얻지 못한다. 따라서! 모두 평등하게 비교하기 위해 세자리로 만들어줘야한다!
Think 2) 자리수 맞추어 주기
그래서 열심히 구글링해본 결과 sort의 속성인 key값 설정을 통해 비교하는 값을 3자리로 바꾼 다음 정렬을 진행한다.
# 내림차순으로 정렬
numbers_str.sort(key=lambda x:x*3, reverse=True)
# 정렬 후 => ["999", "555", "343434", "333", "303030"]
#출력
['9', '5', '34', '3', '30']
Think 3) 문자열로 다시 바꾸기
이제 문자열로 바꾸어 출력해야한다. 하지만 모두 0인 경우를 고려해야하기때문에 한번 int변환을 한 후, 다시 str변환을 진행한다.
answer = str(int(''.join(numbers_str)))
# answer = '9534330'
<모두 0인 경우 + 형변환 안한 경우>
#[0,0,0,0]
answer = ''.join(numbers_str)
# 출력
# '0000'
answer = str(int(''.join(numbers_str)))
# 출력
# '0'