https://school.programmers.co.kr/learn/courses/30/lessons/42746
이 문제의 핵심은 리스트의 정렬과 문자열의 정렬의 차이를 이해하고, 문제의 조건에 맞게 어떻게 정렬하는가이다.
우선, 리스트의 정렬과 문자열의 정렬의 차이를 이해해보자.
numbers = [3, 30, 34, 5, 9]
numbers.sort(reverse=True)
print(numbers) # [34, 30, 9, 5, 3]
numbers = [3, 30, 34, 5, 9]
numbers = list(map(str, numbers))
numbers.sort(reverse=True)
print(numbers) # ['9', '5', '34', '30', '3']
위와 같이, 리스트의 정렬은 정말 숫자 크기대로 내림차순으로 정렬이 되었지만, 문자열의 정렬은 앞에 있는 숫자가 큰 순서대로 정렬이 되었다. 하지만, 우리가 원하는 것은 단순히 문자열의 앞의 글자가 큰 순서대로 정렬을 하는 것이 아니다.
숫자를 이어 붙였을 때, 더 큰 숫자가 나올 수 있도록 배치해야 한다.
예를 들어, 위의 예시에서는 30 -> 3의 순서로, 이를 이어 붙이면 303이 되지만, 둘의 순서를 바꾼 330이 더 큰 숫자가 된다.
따라서 이러한 조건에 맞춰 정렬을 할 수 있는 방법에 대해 생각해야 한다.
numbers = [3, 30, 34, 5, 9]
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
print(numbers) # ['9', '5', '34', '3', '30']
이를 위해 숫자를 3번 반복해서 비교한다. 이렇게 하는 이유는 각 숫자가 최대 1000까지 주어지므로, 문자열의 길이를 맞춰 비교하기 위함이다.
예를 들어, 숫자 3과 30을 비교할 때 "3"은 "333", "30"은 "303030"으로 변환하여 비교하게 된다. 그럼 문자열에서는 333 > 303030으로 보게 되므로, 3 다음에 30이 오도록 정렬이 된다.
이것은 두 문자열을 이어붙였을 때 발생할 수 있는 순서 문제를 해결하는 간단한 방법이다.
이러한 핵심을 파악하였다면, 문제는 다 푼 것이다! 소스코드를 보자.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
answer = ''.join(numbers)
return '0' if answer[0] == '0' else answer
'Algorithm > 코딩테스트 고득점 Kit' 카테고리의 다른 글
[고득점 Kit / 완전탐색] 모의고사 (0) | 2024.09.11 |
---|---|
[고득점 Kit / 정렬] H-Index (0) | 2024.09.11 |
[고득점 Kit / 정렬] K번째수 (0) | 2024.09.09 |
[고득점 Kit / 스택&큐] 주식가격 (2) | 2024.09.06 |
[고득점 Kit / 스택&큐] 프로세스 (0) | 2024.09.06 |