코딩테스트 연습 - 가장 큰 수
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" |
문제 풀이
프로그래머스 기준 난이도 LEVEL 2문제이다.
처음에 보고 Permutations으로 풀었지만 테스트 케이스 대부분 시간초과로 해결하지 못했다
숫자끼리 묶는 알고리즘을 따로 만들려했지만 실패하고 타 블로그에서 정답을 봤지만 30분동안 봐도 이해가 안갔다
def solution(numbers):
arr = [str(x) for x in numbers]
arr.sort(key=lambda x:x*3, reverse=True)
return str(int("".join(arr)))
숫자를 string 형태의 리스트로 만든 뒤 lambda로 정렬만 하면 되는 문제였다
근데 저 x*3이 도무지 이해가 안가서 한참 찾아보다 겨우 이해했다
문자열 비교연산에서는 첫번째 인덱스를 Ascii숫자로 바꿔서 비교하고, 같을 시 그 다음 인덱스를 Ascii숫자로 변환 후 비교한다고 한다
- [6, 10, 2]의 경우 reverse로 sort할 경우 [6, 2, 10]을 변환한다
- [3, 30, 34, 5, 9]의 경우 [9, 5, 34, 30, 3]을 변환한다
- 하지만 문제의 풀이대로면 3이 30보다 앞으로 와야하니 lambda x: x*3을 이용한다 (numbers의 원소는 1,000이하이기 때문에)
- [333, 303030]을 비교하면 333의 두 번째 index가 303030보다 Ascii숫자가 크니 333이 앞으로 온다
- 마지막으로 return할때 "".join(arr)만 하면 몇몇 테스트 케이스 통과가 안된다
- 찾아보니 0이 중복되는 반례가 있다고한다
- 따라서 int()로 변환 후 다시 str()으로 바꿔준다
간단한 문제인데 생각보다 시간을 너무 많이 쏟은 것 같다...
lambda를 이용한 정렬은 많이 연습했는데 string 정렬의 성질에 대해서 생각못했다, 공부 더 해야겠다
'Algorithms > 프로그래머스 (Programmers)' 카테고리의 다른 글
[프로그래머스] 야근 지수 (Python) (0) | 2022.03.25 |
---|---|
[프로그래머스] 주식가격 (Python) (0) | 2022.03.25 |
[프로그래머스] 베스트앨범 (Python) (0) | 2022.03.25 |
[프로그래머스] 크레인 인형뽑기 게임 (Python) (0) | 2022.03.23 |
[프로그래머스] k진수에서 소수 개수 구하기 (Python) (0) | 2022.03.23 |