codes/programmers

42746 가장 큰 수

카제xd 2024. 12. 31. 17:20

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

# trial 1 -> permutation 사용 (시간 초과)

from itertools import permutations

def solution(numbers):
    perm_lst = list(permutations(numbers))
    max_num = max([int("".join(map(str, perm))) for perm in perm_lst])
    
    return str(max_num)

 

 

# trial 2 -> 문자열 정렬 + 자릿수 차이 보완 (타인 코드 참조)

- (프로그래머스 댓글 인용) 숫자를 반복시키는 이유는 앞에서부터 같은 숫자패턴이 존재하는 숫자들의 비교를 위해서입니다. 기존 숫자를 반복시키게 되면 그 숫자가 앞에 왔을 때 만들 수 있는 최대 숫자를 만들 수 있습니다. (완전한 숫자는 아니구요. 비교가 가능한 범위까지 만들 수있어요)

- [9, 991] 이나 [221,2,10] 의 예시를 생각해보면 쉬움. 9나 2를 3번 반복하지 않으면 99x이나 22x과 적절한 비교가 불가능함. 그리고 이 조건에서 3인 이유는 numbers의 원소가 0이상 1000이하기 때문 (패턴이 세자리까지)

- 약간 앞 패턴이 겹치는 만큼 추가로 반복해줘야하는 느낌? 근데 앞패턴이 최대 2개까지 겹칠 수 있음 (3개 겹치면 사실상 비교 우위가 없어짐 e.g. 9와 999)

- 그리고 자릿수가 적은 것을 좀 더 채워주는 느낌이기 때문에 채우다가 큰 자릿수에 맞춰지면 그 이후로는 비교가 의미없어지는듯

def solution(numbers):
    seq = list(map(str, numbers))
    seq.sort(key=lambda x: x*3, reverse=True)
    
    if sum(numbers) == 0: # 일괄 str(int()) 적용하는 것 보다 더 시간효율적 이라고함
        return "0"
    else:
        return ''.join(seq)

 

 

[개선할 점]

- 이 방법 외에도 모든 숫자 조합을 각각 이어붙어보며 정렬하는 방식도 있음

sorted(n, key=functools.cmp_to_key(comparator), reverse=True)
# return -1: 먼저 들어온 요소가 앞으로 정렬
# return 0 : 바뀌지 않음
# return 1 : 나중에 들어온 요소가 앞으로 정렬

 

'codes > programmers' 카테고리의 다른 글

87946 피로도  (1) 2025.01.07
42747 H-Index  (2) 2025.01.01
42583 다리를 지나는 트럭  (1) 2024.12.30
42578 의상  (0) 2024.12.27
42584 주식가격  (1) 2024.12.27