본문 바로가기

Algorithm/코딩테스트 고득점 Kit

[고득점 Kit / 정렬] 가장 큰 수

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제의 핵심은 리스트의 정렬과 문자열의 정렬의 차이를 이해하고, 문제의 조건에 맞게 어떻게 정렬하는가이다.

 

우선, 리스트의 정렬과 문자열의 정렬의 차이를 이해해보자.

 

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