파이썬으로 프로그래머스 풀기 :: 가장 큰 수
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
---|---|
[6, 10, 2] | 6210 |
[3, 30, 34, 5, 9] | 9534330 |
https://programmers.co.kr/learn/courses/30/lessons/42746
코드
1 2 3 4 | def solution(numbers): numbers = list(map(str, numbers)) answer = "".join(sorted(numbers, key=lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]),reverse=True)) return answer if int(answer) != 0 else "0" | cs |
numbers를 각 자리수로 정렬하는데, 6처럼 한 자리 숫자는 x[1]이나 x[2], x[3]을 가져올 수 없으므로, 나머지 연산으로 가져온다.
* 최대 1,000 까지이므로 총 4자리만 확인해주면 된다.
예) [12, 212]
> list(map(lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]), ["12","121"]))
[('1', '2', '1', '2'), ('1', '2', '1', '1')]
예) [21, 212]
> list(map(lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]), ["21","212"]))
[('2', '1', '2', '1'), ('2', '1', '2', '2')]
* 이 문제에서 많이 틀리는 반례로는
[0, 0, 0, 0] -> 0
[12, 121] -> 12121
[21, 212] -> 21221
[999, 9, 998] -> 9999998
정도가 있다.
코드 :: 다른 사람의 풀이
1 2 3 4 | def solution(numbers): numbers = list(map(str, numbers)) numbers.sort(key=lambda x: x*3, reverse=True) return str(int(''.join(numbers))) | cs |
string에서는 대소 비교가 일반 숫자랑은 다르기 때문에 가능한 코드이다.
> "3" > "24"
True
> "12"*3 > "121"*3
True
> "212"*3 > "21"*3
True
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 다리를 지나는 트럭 in python (1) | 2019.12.11 |
---|---|
[프로그래머스] 쇠막대기 in python (0) | 2019.12.10 |
[프로그래머스] 카펫 in python (5) | 2019.12.08 |
[프로그래머스] 124 나라의 숫자 in python (2) | 2019.12.07 |
[프로그래머스] 2 x n 타일링 in python 파이썬 (0) | 2019.12.06 |