[프로그래머스] 가장 큰수 🐳 (Python) / level2 / 정렬
- Programming/알고리즘
- 2022. 10. 22.
1. 문제🔥
링크: https://school.programmers.co.kr/learn/courses/30/lessons/42746
요약하자면, 숫자 배열이 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 리턴해야 합니다.
1) 예제 입출력❄️
첫 번째 예시를 보면, [6, 10, 2]에 대해 [6102, 6210, 1062, 1026, 2610, 2106]와 같은 조합을 만들 수 있고 가장 큰 수는 6210입니다. 이를 문자열 "6210"으로 리턴해야 합니다.
2. 핵심 논리☢️
숫자는 큰수가큰 수가 앞에 나와야 합니다. 하지만 3과 31중에 31보다 3이 앞에 나와야 더 큰 수가 됩니다. 313보다 331이 더 크기 때문입니다. 즉, 3과 31을 비교할 때는 33과 31을 비교해야 합니다. 근데 문자열은 사전 순으로 비교가 되고, 입력되는 수는 0 이상 1000 이하입니다. 즉, 3과 31을 비교할 때, "333"과 "313131"을 사전 순으로 비교하면 "333"이 더 뒤에 나오게 되며, 더 큽니다. 즉, 문자열을 3번 반복해서 비교하게 되면, 3 자릿수까지는 사전 순으로 비교가 가능해집니다. 이게 핵심 원리입니다.
3. 풀이 코드✅
def solution(numbers):
s = list(map(str,numbers))
a = sorted(s,key=lambda x: x*3,reverse=1)
return str(int("".join(a)))
먼저 주어진 숫자 리스트 numbers를 문자열 리스트 s로 바꿔줍니다. 그리고 정렬을 해주는데, key=lambda x: x*3을 이용해 역순으로 정렬해 줍니다. 이는 "3" 과 "32"의 비교에서 "333"과 "323232"의 비교를 역순으로 하는 것입니다. 사전 순으로 따지면 "333"이 뒤에 나오며, 역순이니 앞에 나오게 됩니다. 즉, 정렬 결과 a는 더 큰 숫자 문자열이 앞에 나오는 내림차순으로 정렬됩니다. 여기서 문자열 리스트를 join 해서 int로 바꾸고 str 취해서 반환합니다. 여기서 int로 바꾸고 str로 변환하는 이유는 a에 ["0", "0"]에 대해 int를 취해주지 않으면 "00"으로 반환됩니다. 문제는 이를 "0"으로 반환하고 싶으므로 str(int("00")) 이렇게 하면, "0"으로 반환됩니다.
읽어주셔서 감사합니다.
다음에 더욱 유익한 글로 찾아오겠습니다.
* 관련 풀이 코드는 아래 깃허브 링크에 있습니다.
Reference)
1. Programmers Logo: https://programmers.co.kr/
'Programming > 알고리즘' 카테고리의 다른 글
[백준] 11000 - 강의실 배정 🏫 (Python) / 골드 5 / 정렬 (0) | 2022.10.24 |
---|---|
[프로그래머스] H-Index 📇 (Python) / level2 / 정렬 (0) | 2022.10.23 |
[백준] 1202 - 보석 도둑 💎 (Python) / 골드 2 / 정렬 / 그리디 (0) | 2022.10.21 |
[프로그래머스] 네트워크 🌐 (Python) / level3 / DFS (0) | 2022.10.14 |
[백준] 1461 - 도서관 📚 (Python) / 골드 5 / 그리디 (0) | 2022.10.07 |