본문 바로가기
Algorithm/programmers

[프로그래머스] 가장 큰 수

by 밤초록 2023. 5. 14.
가장 큰 수 | Lv.2
https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

 

작성코드

 

str 정렬 후 join (실패)

 

def solution(numbers):
    return "".join(sorted(list(map(str, numbers)), reverse=True))

 

  • numbers 내 원소들을 string 형으로 변환 >> 내림차순 정렬 >> join으로 하나의 string 값으로 만듦
  • numbers = [3, 30, 34, 5, 9]
    >> 9534303
    3 30 34인 경우 34 3 30 순으로 해야 가장 최대의 값이 나옴

 

순열 이용 (실패)

 

from itertools import permutations


def solution(numbers):
    answer = 0
    per = permutations(numbers, len(numbers))
    for p in per:
        per_int = int(''.join(map(str, p)))
        if per_int > answer:
            answer = per_int
    return str(answer)

 

  • 순열 함수를 이용하여 모든 경우의 수 계산
  • answer 엔 max 값만 저장하도록 함(공간복잡도 측면)
  • 시간초과 발생

 

 

이상 코드

 

def solution(numbers):
    # numbers 원소들을 string 형태로 변환 후 저장
    numbers_str = list(map(str, numbers))
    
    # 원소의 길이가 1,000 이하이기 때문에 비교 시 최소한 3자리로 맞춰야 함 3, 30, 34 -> 333 303030 343434
    numbers_str.sort(key = lambda num : num * 3, reverse = True)
    
    #  numbers_str 내 원소드를 연결, str -> int -> str 형태로 변환
    return str(int(''.join(numbers_str)))

 

  • 각각의 원소 nums * 3을 한 값을 key로 하여 정렬함으로써 3, 30, 34를 정렬할 수 있음
    단순 3 30 34를 string 형태로 변환 후 정렬한다면 34 30 3 이 됨 (문제에서 요구하는 정렬은 34 3 30)
    34 33 30으로 생각한다면 단순 sort를 써서 정렬해도 잘 됨!

    -> 여기까지는 접근했었는데 3을 33으로 바꾸는 과정에서 구현 갈피를 못 잡음
    -> nums * 3을 함!! 어차피 numbers 원소는 최대 1000, 즉 최소의 한 자리의 숫자를 비교하기 위해서는 세 자리로만 늘려도 된다는 것! 

    3 30 34 -> 333 303030 343434 --(sort)--> 343434 333 303030
  • return 시 굳이 str -> int -> str으로 변환하는 이유는 0이 시작값일 경우 str은 "003"을 반환함, 앞의 0은 무시하도록 int 변환 후 문제 요건에 맞게 str으로 변환함

 

반응형

댓글