728x90
📖 문제 : 가장 큰 수 (Python)
문제 설명
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" |
※ 공지 - 2021년 10월 20일 테스트케이스가 추가되었습니다.
내 코드
def solution(numbers):
answer = ''
temp = []
numbers = list(map(str,numbers))
for x in numbers:
print( (x*4)[:4])
numbers.sort(key=lambda x : (x*4)[:4], reverse = True)
answer = ''.join(numbers)
# 0이 여러개일 경우, '0' 반환
if answer[0] == '0':
return '0'
else:
return answer
Point ! ⭐️
- numbers.sort(key=lambda x : (x*4)[:4]) : x를 네번 반복하고 반복한 값을 네자리까지 끊은 값들을 정렬
예를 들어 numbsers 리스트에는 [1, 89, 5, 667] 값이 있다고 하면
[1, 29, 5, 667] 을 [1111, 89898989, 5555, 667667667667] 로 네번 반복한 뒤 [1111, 8989, 5555, 6676] 이렇게 자른 후 정렬 ! 그렇다고 원래의 리스트 numbers 함수가 바뀌는 것은 아니고 결국 [1, 89, 5, 667] 을 [1111, 8989, 5555, 6676] 이렇게 생각하여 [1111, 5555, 6767, 8989] 로 되어
[1, 89, 5, 667] => [1, 5, 667, 89] 로 정렬되는 것 !
이렇게 한 이유는 예시를 보면 이해가 될텐데
[3, 30, 34, 5, 9] | "9534330" |
- 여기서 가장 앞의 자리 수만으로 높은거 먼저 해서 정렬한다고 하면
9534303으로 정렬된다. 30이 3보다 더 뒤에 정렬되어야 답이 나오는 것 !
그래서 30을 3030으로 3을 3333으로 취급하여 내림차순으로 정렬해주면 답을 구할 수 있다.
프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/42746
728x90
'Algorithm (Python, Java, SQL) > Programmers' 카테고리의 다른 글
[프로그래머스 고득점 Kit - 완전 탐색] 모의고사 (Python) (0) | 2023.05.23 |
---|---|
[프로그래머스 고득점 Kit - 완전 탐색] 최소 직사각형 (Python) (0) | 2023.05.23 |
[프로그래머스 SQL(String, Date)] 자동차 대여 기록에서 장기/단기 대여 구분하기 (CASE WHEN, DATEDIFF) (1) | 2023.05.22 |
[프로그래머스 SQL(String, Date)] 대여 기록이 존재하는 자동차 리스트 구하기 (DISTINCT) (0) | 2023.05.22 |
[프로그래머스 고득점 Kit - 정렬] K번째 수 (Python) (0) | 2023.05.19 |