가장 큰 수
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