0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
진짜 오래 고민한 문제다. 총 3시간은 넘게 고민했는데 막혀서 결국 아이디어를 참고한 아쉬운 문제다.
처음 생각한 건 문자열로 만들어 정렬하면 앞자리가 큰 수가 앞으로 오니까 제일 큰 수 아닐까?? 뭐야 미쳤다 라고 생각했지만 변수가 있었다.
3보다 30이 앞에 있어야 하는데 이렇게 할 경우 3이 뒤로 간다. 그래서 앞자리가 같은 경우에만 다시 정렬을 해주는 방법도 생각해봤지만 너무 복잡하고 시간도 오래걸리는 것 같았다.
오? 맨 뒤의 숫자가 큰 게 앞으로 오면 되는거 아냐??? 뚝딱뚝딱 코드를 고쳤더니 테스트는 모두 통과했다. ㄴㅇㅅ 근데 정확성 20퍼 실화?
맞왜틀??? 근데 또 고민해보니 십의 자리는 작고 일의자리는 큰 경우 앞 순위에 오게 되는데 십의 자리가 큰 게 앞으로 와야 되서 틀린 생각이였다. 그렇다고 자릿수를 다 비교하기엔 고려사항이 너무 많았다.
와 어떻게 이런 생각을 하지? 값이 0~1000이니까 문자열을 3번 반복해주고 4자리수로 잘라서 정렬한다. [0,0,0,0]과 같이 0이 반복되는 케이스를 고려하여 int로 캐스팅 후 다시 string으로 변환해준다.
def solution(numbers):
str_list = list(map(str, numbers))
answer = ''
length_list = []
for i in range(len(str_list)):
length = len(str_list[i])
temp = (str_list[i]*3)[:4]
length_list.append((temp, length))
length_list.sort(reverse=True)
for i, j in length_list:
answer += i[:j]
return str(int(''.join(answer)))
sort()의 옵션으로 요소를 직접 바꾸지 않고 반복된 문자열을 기준으로 정렬할 수 있다는 것을 알게 되었다.
세상엔 참 대단한 사람들이 많은 것 같다.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))