[programmers] 가장 큰 수

hotbreakb·2022년 4월 16일
0

algorithm

목록 보기
18/25

가장 큰 수

나의 접근법

str으로 변환된 큰 수부터 정렬해서 str으로 리턴하였다. 틀려버렸다~
왜냐하면 [3, 30, 34, 5, 9]와 같은 입력이 있을 때 큰 수부터 정렬하면 [9, 5, 34, 30, 3]이 되어 9534303이 되는데 이것은 최댓값이 아니다.

다시 풀었을 때

[3, 34, 30]30보다 앞에 나와야 하는 숫자가 3이라는 것을 알기 위해서는 숫자를 3번 반복해보면 된다. 3번 반복하는 이유는 numbers의 원소는 0 이상 1,000 이하이기 때문이다. 만약 10,000 이하의 숫자라면 4번 반복해보면 된다.

[3, 34, 30][333, 343434, 303030][343434, 333, 303030][34, 3, 30]

입력받은 숫자가 중복되었을 경우를 생각해 dict의 value를 list로 만들어서 정렬했는데 이보다 더 짧은 코드가 있다.

from typing import OrderedDict


def solution(numbers):
    big_number = ""
    repeated_str_numbers = dict()

    for num in numbers:
        num = str(num)
        if num not in repeated_str_numbers.keys():
            repeated_str_numbers[num] = [str(num)*3]
        else:
            repeated_str_numbers[num].append(str(num)*3)

    repeated_str_numbers = OrderedDict(
        sorted(repeated_str_numbers.items(), key=lambda item: item[1], reverse=True))

    for num, str_num in repeated_str_numbers.items():
        for _ in range(len(str_num)):
            big_number += num

    if set(big_number) == {'0'}:
        return "0"

    return big_number

더 간결한 코드

  1. str으로 변환
  2. 길이를 3배 곱해 큰 수부터 정렬
  3. join하여 str으로 변환하여 int를 씌우면 0000 → 0, 1234 → 1234
def solution(numbers):
    numbers = list(map(str, numbers))
    numbers = sorted(numbers, key=lambda item: item*3, reverse=True)
    return str(int(''.join(numbers)))
profile
글쟁이 프론트 개발자, 헬렌입니다.

0개의 댓글