[프로그래머스/Lv.2] 가장 큰 수 (with 파이썬)
✔ 문제
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/42746
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔ 풀이
오답 코드 (입출력 예제 2번 실패)
def solution(numbers):
answer = ''
for i in range(len(numbers)):
numbers[i] = str(numbers[i])
numbers.sort(reverse=True)
for i in numbers:
answer += i
return answer
오답 코드 2 (TC 11번 - [0, 0, 0, 0])
def solution(numbers):
answer = ''
num_str = []
for i in numbers:
num_str.append(str(i))
num_str.sort(key=lambda x: x*3, reverse=True)
for i in num_str:
answer += i
return answer
정답 코드
def solution(numbers):
num_str = []
for i in numbers:
num_str.append(str(i))
num_str.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(num_str)))
✔ 설명
1. 숫자 상태에서 정렬을 하지 말고 문자열로 치환
2. 문자열로 변경한 숫자에 3을 곱한 값으로 재정렬
3을 곱하지 않고 정렬 시 사전값으로 정렬은 되나 TC에 맞지 않은 답이 나올 수 있음
ex) [3, 30, 34, 5, 9]을 *3 없이 정렬한다면(reverse=True) 사전 순으로 정렬이 되는데
[9, 5, 34, 30, 3] 과 같이 정렬이 된다. 이를 바로 return 하게 된다면 9534330이 아닌 9534303이 리턴된다.
따라서 *3을 곱하여 [999, 555, 343434, 303030, 333] 을 가지고 정렬을 해야한다.
3. 값을 반환 시 int > str 단계를 거쳐야 한다.
✔ 후기
설명의 1번까지는 해결했으나 [30, 3] 이 순서를 바꾸는 방법을 생각해낼 수 없었다.
그리고 *3을 한 후 제출했더니 TC 11번에서 실패가 떠서 다시 고민했다.
11번의 경우 numbers = [0,0,0,0] 이라 return 값은 0이 나와야한다.
for문을 돌면서 answer += i 를 하면 0000이 return 되기 때문에 설명 3번처럼 num_str을 int로 바꾼 후 str로 다시 변경해야한다.