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

Gyuhan Park·2022년 7월 22일
0

코딩테스트 정복

목록 보기
45/47
post-thumbnail

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)))
profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글