프로그래머스 등급2 - 가장 큰 수
가장 큰 수 문제 바로 가기
풀이 날짜: 2026-05-24
baekjoon 알고리즘 문제 풀이
풀이 코드
def solution(numbers):
sorted_list = list(map(str, numbers))
sorted_list.sort(key = lambda x: x * 3, reverse = True)
answer = ''.join(sorted_list)
return str(int(answer))
문제 핵심
처음에는 숫자를 하나씩 이어붙이며 가장 큰 값을 만드는 방식으로 접근하려 했다. 하지만 이 문제는 단순히 숫자의 크기를 비교하는 것이 아니라, 어떤 숫자를 앞에 배치했을 때 전체 결과가 더 커지는지를 판단해야 하는 문제였다. 예를 들어 3과 30의 경우 숫자 자체는 30이 더 크지만, 실제로 이어붙이면 “330”이 “303”보다 크기 때문에 3이 앞에 와야 한다는 점을 확인할 수 있었다.
접근 방법 (아이디어)
이 문제의 핵심은 두 숫자를 이어붙인 결과를 비교하는 것이다. 즉, a+b와 b+a 중 어떤 값이 더 큰지를 기준으로 정렬해야 한다. 이를 위해 숫자를 문자열로 변환하여 비교하는 방식을 사용하였다. 문자열 상태에서는 “3” + “30”처럼 이어붙인 값을 쉽게 비교할 수 있기 때문이다.
정렬 방식 구현
모든 숫자를 문자열로 변환한 뒤, sort() 함수의 key를 활용하여 정렬을 수행하였다.
여기서 x * 3을 사용한 이유는 문제의 숫자가 최대 세 자리 수이기 때문이다. 문자열을 반복하여 길이를 맞춰 비교하면 실제 이어붙였을 때의 대소 관계와 동일한 효과를 얻을 수 있다. 또한 가장 큰 수를 만들어야 하므로 reverse=True를 사용하여 내림차순 정렬을 적용하였다.
결과 문자열 생성
정렬이 완료된 후에는 join() 함수를 사용하여 리스트에 있는 문자열들을 하나의 문자열로 합쳤다. 이 과정을 통해 정렬된 숫자들이 순서대로 이어붙여진 최종 결과 문자열을 만들 수 있었다.
예외 처리
마지막으로 모든 숫자가 0인 경우를 처리해야 했다. 예를 들어 [0, 0, 0]을 그대로 이어붙이면 “000”이 되지만, 문제에서는 “0”을 반환해야 한다. 이를 해결하기 위해 한 번 int로 변환하여 앞의 불필요한 0을 제거한 뒤 다시 문자열로 변환하였다. 이 방법을 통해 “000”과 같은 경우도 올바르게 “0”으로 처리할 수 있었다.