코딩 연습/Python

가장 큰 수

썬2 2021. 12. 8. 19:35

https://programmers.co.kr/learn/courses/30/lessons/42746?language=python3 

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

계속 시간 초과가 된 문제.

답을 보았는데 아스키코드를 활용해서 풀면 간단히 구할 수 있었다..!!

 

숫자를 다 문자열로 바꾼다.

int면 6 < 10 으로 10이 더 큰 숫자로 인식된다.

하지만, str이면 6 > 10이 된다. 왜냐하면 6이 1보다 더 큰 숫자로 인식되기 때문이다.

 

sort할 때 lambda x:x*3을 한다.

제한조건에서 numbers의 인수는 모두 1,000 이하이다. 그래서 3자리수로 모두 정리해서 문자열을 비교한다.

즉, 6, 10, 2가 있으면  => x*3을 통해 666, 101010, 222가 된다.

666, 101010, 222를 아스키 코드를 이용하여 비교하면 666, 222, 101010이 비교되어서 666, 222, 101010으로 정리된다.

(참고: 3, 30, 34, 5, 9이 온다면 => str로 맵핑 후 x*3 => 333, 303030, 343434, 555, 999 => 

333, 303030, 343434, 555, 999 에서 검은색 글씨를 비교한다: 999 > 555 > 333 = 303030 = 343434가 된다.

333, 303030, 343434를 비교한다: 343434 > 333 > 303030 ==> 999,  555, 343434, 333, 303030이 된다.)

 

마지막에 int로 변환 후 str로 바꾼다.

왜냐하면 0000이 오는 경우 0으로 바꾸어야되어서!

0, 0, 0, 0이 들어온 경우: sort를 거치고 join하면 0000이 된다. 이를 int에 적용하면 0이 된다. 이를 str에 적용하면 0이 된다.

 

def solution(numbers):
    print('기존', numbers)
    n_numbers = list(map(str, numbers))
    print('맵핑 후', n_numbers)
    n_numbers.sort(key=lambda x:x*3, reverse=True)
    print('정렬 후', n_numbers)
    print('join 후', ''.join(n_numbers))
    print('int 적용', int(''.join(n_numbers)))
    print('str 적용', str(int(''.join(n_numbers))))
    return str(int(''.join(n_numbers)))

numbers = [3, 30, 34, 5, 9]
print('결과', solution(numbers))

#기존 [3, 30, 34, 5, 9]
#맵핑 후 ['3', '30', '34', '5', '9']
#정렬 후 ['9', '5', '34', '3', '30']
#join 후 9534330
#int 적용 9534330
#str 적용 9534330
#결과 9534330

 

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

 

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

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

jokerldg.github.io