1. 문제
https://programmers.co.kr/learn/courses/30/lessons/42746
2. 풀이 방법
- 저는 문제 해결 방법을 잘 못 잡아서 문제를 해결하지 못하여 해설을 보았습니다.
- 풀이는 크게 2가지로 보여지고, 하기 소스코드에 풀이 별로 설명해놓았습니다.
3. 소스코드
3.1. 비교 문자열 2개를 연결하여 비교하는 방식
- 두 숫자 중에서 앞으로 나가야 될 숫자를 선택하려면, string으로 변환한 a와 b를 연결한 a+b, b+a 를 다시 number로 변환하여 중에서 더 큰 숫자를 가지는 순서대로 정렬하면 됩니다.
- 위의 문제 풀이 방법을 가장 적절하게 사용한 풀이라고 할 수 있습니다.
- 1라인에서 모든 배열의 number를 str로 변환하고
- 2라인에서 lamda 함수를 사용하여 x의 자리수를 길게 해줍니다.
- 프로그래머스에서 위의 방식으로 가장 짧게 문제를 잘 해결한 코드는 아래와 같습니다.
import functools
def comparator(a,b):
t1,t2 = a+b, b+a
return (int(t1) > int(t2)) - (int(t1) < int(t2)) # t1이 크다면 1, t2가 크다면 -1, 같으면 0
def solution(numbers):
n = [str(x) for x in numbers]
n = sorted(n, key=functools.cmp_to_key(comparator), reverse=True)
answer = str(int(''.join(n)))
return answer
3.2. 문자열의 길이를 3배로 늘린 후에 비교하는 방식
- python에서 str에 * 숫자를 해주면 원하는 만큼 글자수가 늘어납니다. ‘1’3 은 ‘111’, ‘12’3는 ‘121212’ 와 같은 방식입니다.
- 두 수 중 먼저 올 수를 비교하는 방법 중에는, 해당 숫자를 최소 3자리 숫자로 위의 방식과 같이 *3을 통하여 만든 후에, 두 문자열을 비교하는 방식입니다.
- 문자열 비교는 number로는 더 크다고 하더라도, 비교 방식이 다르기 때문에 다르게 생각해야 합니다.
- str는 첫 문자부터 비교하여 동일한 인덱스에 더 작은 문자열이 나오면 더 작은 문자열이라고 생각합니다.
- 예를 들어, ‘121’과 ‘12’의 경우 ‘121121121’과 ‘121212’를 비교하게 됩니다. 두 문자열 중 ‘12’가 먼저 앞으로 와야되는데, str 비교 방식으로 4번째 idx에서 ‘121212’가 더 크다고 인식하게 됩니다.
- 또 예를 들어, ‘3’과 ‘337’의 경우 ‘333’과 ‘337337337’를 비교하게 됩니다. 두 문자열 중 ‘337’이 먼저 앞으로 나와야되는데, str 비교 방식으로 3번째 idx에서 ‘337337337’이 더 크다고 인식하게 됩니다.
- 프로그래머스에서 위의 방식으로 가장 짧게 문제를 잘 해결한 코드는 아래와 같습니다.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))