-
[코딩테스트 고득점 Kit / Level2 🧒🏻 / 정렬] 가장 큰 수(python)🧠𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/💙프로그래머스 2021. 6. 26. 15:20
1. 문제 설명
https://programmers.co.kr/learn/courses/30/lessons/42746
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
2. 제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
3. 입출력 예
4. 나의 풀이
숫자로 이루어진 배열을 큰 수부터 정렬하여 문자열로 반환하는 문제로서,
각 배열을 문자열로 변경하고 문자열 곱하기를 해준 뒤 내림차순으로 정렬하는 문제이다!!!첫번째 테스트케이스는 맞춰도, 두번째 테스트케이스를 통과하는 것이 어려웠다.
['9', '5', '34', '30', '3']이 아니라,
['9', '5', '34', '3', '30']이 나와야 하는 게 어려웠다.
그래서 다른 사람의 풀이를 참고했다.
5. 다른 사람의 풀이
def solution(numbers): answer = '' # int형의 list를 map을 사용하여 string으로 치환한 뒤, list로 변환한다. numbers = list(map(str, numbers)) numbers.sort(key = lambda x: x*3, reverse=True) return str(int(''.join(numbers)))
['9', '5', '34', '3', '30']이 나오려면, 문자열 곱하기 3을 해서 비교해야하는 아이디어가 필요했다!!
곱하기 3인 이유는 원소들이 0이상 1000이하라는 범위를 갖기 때문이다.
3이라는 문자열을 3번 곱하면 '333'이 나오고
30이라는 문자열을 3번 곱하면 '303030'이 나온다.
숫자로만 보면 333과 303030중에서 당연히 303030이 더 커보이지만,
⭐️문자열의 대소비교는 문자열의 맨 앞(제일 큰자리수, 각 숫자별 맨 왼쪽)부터 하게 된다.
아스키 코드로 확인하면 '3'과 '0'중에 '3'이 더 크기 때문에 '333' > '303030'이다.
sort의 key옵션에 지정된 함수의 결과에 따라 정렬된다.
마지막에 ''.join(numbers)로 문자열인 것을 int로 감싸서 다시 str로 감싸는 이유는
0 0 0 0이 입력으로 들어왔을 때 0000이 나오는 것이 아닌, 0이 나오게끔 하기 위해서이다.
6. 깨달은점
문자열을 대소비교할 때는 왼쪽부터 아스키코드로 변환하여 비교한다.
0000을 int로 감싸면 0이 된다.
'🧠𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 💙프로그래머스' 카테고리의 다른 글
[코딩테스트 고득점 Kit / Level2 🧒🏻 / 완전탐색] 카펫(python) (0) 2021.06.27 [코딩테스트 고득점 Kit / Level2 🧒🏻 / 완전탐색] 소수찾기(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level1 👶🏻 / 정렬] K번째수(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level2 🧒🏻 / 해시] 위장(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level1 👶🏻 / 해시] 완주하지 못한 선수(python) (0) 2021.06.25