Algorithm/프로그래머스

[프로그래머스/Python] 가장 큰 수 - Level2

poppy 2021. 5. 9. 16:01
반응형

programmers.co.kr/learn/courses/30/lessons/42746?language=python3

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

import functools

def compare(a,b):
    sum1, sum2 = int(a+b), int(b+a)
    
    if sum1 > sum2: return 1
    elif sum1 == sum2: return 0
    elif sum1 < sum2: return -1

def solution(numbers):
    answer = ''
    
    numbers = list(map(str, numbers))
    numbers.sort(key = functools.cmp_to_key(compare), reverse = True)
    
    return str(int(''.join(numbers)))

먼저 numbers를 모든 요소를 문자열로 바꿔서 리스트로 저장합니다. 그 다음 가장 큰 수가 될 수 있도록 각 요소를 정렬해줍니다. 이 때 key를 따로 정의한 비교 함수(compare)로 주어 비교 함수에 의해 정렬되도록 합니다. compare함수는 연속된 문자열을 더하여 어느 순서로 더했을 때 더 큰 값이 되는지를 판단합니다. 그리고 가장 큰 수가 될 수 있도록 요소를 조합해야하기 때문에 내림차순으로 정렬합니다. 정렬이 끝나면 numbers의 모든 요소를 합한 값은 리턴해주면 되는데 이 때 중요한 것은 모든 요소를 합한 값을 int로 변환한 뒤 다시 str로 변환합니다. 이렇게 하는 이유는 예를 들어 numbers = [0,0,0,0] 일 때 모든 요소를 합한 값이 '0000' 가 되므로 int로 변환해서 0을 만들어준 후 다시 '0' 을 리턴해줍니다.

 

다른 사람의 풀이를 찾아보았는데 아래 코드처럼 엄청 간단하게 해결할 수 있는 방법이 있었습니다.

def solution(numbers):
    answer = ''
    
    numbers = list(map(str, numbers)) # numbers를 문자열 리스트로 변환
    numbers.sort(key = lambda x : x*3, reverse = True) # 문자열 정렬
    
    return str(int(''.join(numbers)))

여기서 key = lambda x: x*3 부분이 놀랐던 부분이었습니다. 이 부분은 x*3은 문자열을 3번 반복한다는 의미인데 numbers의 요소가 1000이하이므로 모두 3자리로 맞춰준다는 의미입니다. 어떻게 이런 생각을 할 수 있는지 신기했습니다.

 

- 배운 점 -

functools.cmp_to_key(함수명)

내가 원하는대로 비교할 수 있도록 정렬하고 싶을 때 비교함수를 key로 사용합니다. 비교함수에는 a와 b가 있을 때 a값이 더 크면 1, 값이 같으면 0, b값이 더 크면 -1을 반환하도록 정의해주면 됩니다. 내가 원하는대로 비교하고 싶을 때 유용하게 쓸 수 있는 방법인 것 같습니다. 다음 예시를 참고하면 도움이 될 것입니다. 

from functools import cmp_to_key

def compare(x, y):
	if(x[0] < y[0]): # x[0] 값이 y[0]값 보다 작으면
		return 1 # y 내용을 앞으로 보냄
	elif(x[0] > y[0]):
		return -1
	else: # x[0] 값이 y[0]값과 동일하면
		if(x[1] < y[1]): # x[1]과 y[1]을 비교해서 y[1]이 크면
			return -1 # x 내용을 앞으로 보냄
		elif(x[1] > y[1]):
			return 1
		else:
			return 0

sample = [[4,'c'], [10, 'b'], [13, 'b'], [1, 'd'], [10, 'a']]
print(sorted(sample, key=cmp_to_key(compare))) 
# 출력: [[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']]
반응형