코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
문제 설명
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" |
✔ Solution
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))
⭐ 문제 포인트
string은 일반 숫자와 대소비교가 다르기 때문에 가능한 코드!
x * 3 을 해준 이유는 numbers의 원소가 0 - 1000사이의 값을 가지기 때문이다.
예를 들어, numbers = [121, 9, 98, 13] 일 경우,
str로 변경하여 리스트로 저장하고 lambda함수를 이용하여 3번 반복하여 나타낸다.
lambda 함수를 거친 후 '121121121' '999' '989898' '131313' 으로 변환된다.
변환된 문자열 값을 정렬 할 경우 '121121121' < ' 131313' < '989898' < '999' 이고, reverse = True 이므로 반대로 내림차순으로 정렬이 된다.
그 결과 numbers = ['9', '98', '13', '121'] 이 되고 int로 변환 후 join 함수를 이용해 합쳐준다.
(int로 변환하는 이유는 [0, 0, 0] 일 경우 '000' > '0' 으로 나타내주기 위해 사용한다.)
그리고 문자열로 return 하라 하였기 때문에 문자열로 바꿔서 return 해준다.
✔ Solution 2 - 다른 사람 답
import functools
def comparator(a,b):
t1 = a+b
t2 = 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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[2018 KAKAO BLIND] 비밀지도 - Level 1 (0) | 2022.01.21 |
---|---|
[프로그래머스/완전 탐색] 모의고사 - Level 1 (0) | 2022.01.21 |
[프로그래머스/탐욕법 Greedy] 체육복 - Level 1 (0) | 2022.01.20 |
[월간 코드 챌린지 시즌 1] 두 개 뽑아서 더하기 - Level 1 (0) | 2022.01.20 |
[프로그래머스/해시] 완주하지 못한 선수 - Level 1 (0) | 2022.01.20 |