본문 바로가기
Algorithm/Programmers

[프로그래머스] 코딩테스트 고득점 Kit > 가장 큰 수

by du.it.ddu 2020. 3. 7.
반응형

# 문제

# 문제 접근

주어진 정수를 이어 붙여서 가장 큰 수를 만들어 내야 한다.

얼핏 생각하기엔 가장 큰 수부터 이어붙이면 되지 않을까 라는 생각이 들지만 그렇게 하면 안된다.

예를 들어, 6과 10으로 만들 수 있는 가장 큰 수는 106이 아닌 610 이기 때문이다.

두 수를 이어 붙일 때 두 수의 크기를 비교하는 것이 아닌, 두 수를 이어붙였을 때 큰 수가 되어야 큰 수로 판별해야 되는 것이다.

예를 들어 a, b 두 수가 있다면 ab 와 ba를 비교한다. 그리고 ba가 더 크다면 리스트를 b, a로 정렬한다.

입력 예제인 [6, 10, 2] 로 예를 들어 보겠다.

1. 6 vs 10 : 610 > 106 이므로 [6, 10, 2]로 정렬된다.

2. 10 vs 2 : 102 < 210 이므로 [6, 2, 10] 로 정렬된다.

3. 6 vs 2 : 62 > 26 이므로 [6, 2, 10] 로 정렬된다.

이렇게 정렬된 숫자를 나란히 이어붙이면 6210이 되며 가장 큰  수가 된다.

# 문제 풀이

1. 두 수를 전달 받아 이어붙인 후 더 큰 수를 반환하는 compare 함수를 만든다.

2. numbers 를 위에서 정의한 compare 함수를 통해 비교하여 정렬하도록 한다.

3. 리스트의 모든 요소를 이어붙여 반환한다.

# 코드 작성

# sorted 함수에 커스텀한 compare 함수를 전달하기 위해 필요하다.
from functools import cmp_to_key

def solution(numbers):

	# compare 함수를 통해 값을 비교하도록 전달하고 정렬한다.
    # reverse가 True인 이유는 오름차순으로 정렬되기 때문에 내림차순으로 바꾸기 위해서이다.
    sorted_number = sorted(numbers, key = cmp_to_key(compare), reverse = True)
    
    # 정렬한 결과의 요소들은 int형이므로 str형으로 바꿔 리스트로 저장한다.
    sorted_number = list(map(str, sorted_number))
    
    # join 함수로 모든 요소를 이어붙인다.
    answer = str(int(''.join(sorted_number)))

	# 결과를 반환한다.
    return answer

# 두 수를 이어붙여 비교 결과를 반환하는 함수다.
def compare(num1, num2) :
    candidate1 = int(str(num1) + str(num2))
    candidate2 = int(str(num2) + str(num1))
    
    if candidate1 > candidate2 :
        return 1
    
    else :
        return -1

 

 * 본 문제의 출처는 프로그래머스(https://programmers.co.kr/) 입니다. 문제가 될 시 삭제하겠습니다.

반응형