본문 바로가기
온라인 저지/프로그래머스

[PGS/Python] 가장 큰 수

by ahj 2021. 11. 6.

https://programmers.co.kr/learn/courses/30/lessons/42746

문제 설명 해설

주어진 숫자(0 이상의 정수) list에 있는 숫자들을 이어붙여서 만들 수 있는 숫자들 중에서 가장 큰 수를 구해주면 된다.

해설 하려고 보니 생각보다 문제 자체는 이해가 쉬운 문제라서..

 

numbers return
[6, 10, 12] "61210"
[3, 30, 34, 5, 9] "9534330"

접근법을 생각해보자면

numbers의 element들을 전부 str화 시키고

각 element의 0번 index의 값끼리 비교하고 같으면 다음 것, 다음 것... 이렇게 비교해서 큰 놈부터 앞으로 가져오면 될 것 같다!

def solution(numbers):
    sorted1= sorted(numbers, key = lambda x: x//1000, reverse = True)
    sorted2= sorted(sorted1, key = lambda x: (x%1000)//100, reverse = True)
    sorted3= sorted(sorted2, key = lambda x: (x%100)//10, reverse = True)
    sorted4= list(map(str, sorted(sorted3, key = lambda x: x%10, reverse = True)))
    answer=''.join(sorted4)
    return answer

이런 방법을 시도했지만 실패...

def solution(numbers):
    numbers_str = list(map(str, numbers))
    sorted1 = sorted(numbers_str, key = lambda x :x[0], reverse = True)
    sorted2 = sorted(sorted1, key = lambda x :x[1] if len(x)>1, reverse = True)
    sorted3 = sorted(sorted1, key = lambda x :x[2] if len(x)>2, reverse = True)
    sorted4 = sorted(sorted1, key = lambda x :x[3] if len(x)>3, reverse = True)
    answer = ''.join(sorted4)
    return answer

이렇게 말도 안되지만 의도는 전달되는(?) 코드로도 실패..

이렇게 거의 pseudo code나 다름 없는 코드로 여러 번의 실패를 겪고나서...

문자열 숫자의 경우에도 ascii코드에서 크기는 원래 숫자 순서대로라서 문자열로 바꿔주고 비교해도 된다.

 

+풀이

아무리 짱구를 굴려봐도 문자열 길이가 맞지 않는 것들끼리 비교할 방법을 떠올리지 못하고 결국.. 검색의 길로..😂

https://jokerldg.github.io/algorithm/2021/05/06/most-big-number.html

 

프로그래머스 가장 큰 수 (python 파이썬) - Tech

프로그래머스 가장 큰 수 (python 파이썬) May 06, 2021

jokerldg.github.io

아이디어는 비슷하게 가져갔는데 계속 부딪힌 것이 문자열의 out of range 예외 발생이었다.

그런데 이럴 수가! 문자열 * 3 으로 어차피 길이를 맞춰주고 하면 될 일 이었다..!

 

https://programmers.co.kr/questions/19905 여기에서 말하는 규칙을 따져서 생각을 해봐야한다.

 

예를 들어서 

[1, 11, 111, 101, 10, 100, 9, 8] 와 같은 list는 [9, 8, 111, 11, 1, 101, 10, 100] 다음과 같은 순서대로 정렬이 되어야 하는 것인데 문자열이라고 쳐도 위에어 얘기한 대로 x[0]부터 역정렬 한다고 해도 그 다음 비교가 참 어려웠다.

그런데 tech 블로그의 방법대로 문자열 * 3을 해주면

'111', '111111', '111111111', '101101101', '101010', '100100100', '999', '888' 의 문자열들이 있을 때 각 문자열 앞의 3개끼리 비교하게 된다.

'111', '111', '111', '101', '101', '100', '999', '888' 이렇게 비교해주고 역정렬 해주면

'999', '888', '111', '111', '111', '101', '101', '100'

이제 문제가 될법한 숫자는 101, 10 둘중에 무엇이 우선으로 나와야 할까인데

10110와 10101 중 전자 즉, 101, 10의 순서가 10, 101 보다 우선되어야 한다. 따라서 '101101101', '101010'  이 순서로 되어야하는데 '101' '101' 끼리는 같으면 그 다음 것까지 비교해주므로 '1011' 1010'이 돼서 '101'이 '10' 보다 앞서게 된다. 따라서 string * 3 으로 해주는 방법은 이 문제 풀이에 알맞다!

 

# Python
def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x * 3, reverse=True)
    return str(int(''.join(numbers)))

파이썬으로는 구현이 간단했으므로 JavaScript로 구현해보자

'온라인 저지 > 프로그래머스' 카테고리의 다른 글

[PGS/Java] 타겟 넘버  (0) 2022.02.18
[PGS/JavaScript] 이분탐색 - 입국심사  (0) 2022.02.04

댓글