프로그래머스_가장 큰 수

임정민·2024년 3월 2일
0

알고리즘 문제풀이

목록 보기
170/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

⌛ 시간 초과 (26.7/100 , 대부분 케이스 시간복잡도 개선 실패)

[나의 풀이1]

from collections import deque

def solution(numbers):
    answer = '0'
    
    tmp = numbers
    queue = deque([['',0,[-1]]])
    
    while queue:
    
        v,cnt,hist = queue.popleft()

        if cnt==len(numbers):
            if v>answer:
                answer = v
            continue
        
        for i,x in enumerate(tmp):
            if i not in hist:
                queue.append([v+str(x),cnt+1,hist+[i]])
        
    return  answer

정수 배열(numbers)가 주어지고 이를 조합하였을 때, 가장 큰 수를 도출하는 문제입니다.

먼저, Queue 구조를 활용한 BFS 알고리즘으로 구현하였습니다.

Queue 구조에

['현재까지 조합한 문자열','조합한 문자열 갯수','조합한 문자열 체크리스트']

를 조합할 수 있는 최대로 합칠 수 있는 문자열 갯수(cnt==len(numbers))까지 append하며 모든 케이스를 확인하였습니다.

조합을 마친 케이스의 경우 현재까지의 최댓값(answer)과 비교하여 가장 큰 수를 구하였습니다.

채점 결과 모든 케이스에서 정답을 도출하였지만 시간복잡도를 해결하지 못하였습니다.

[나의 풀이2]

from itertools import permutations

def solution(numbers):
    answer = []

    for nums in permutations(numbers,len(numbers)):
        answer.append("".join([str(num) for num in nums]))

    return  max(answer)

다른 방법으로 순열을 통해 구현해보았지만, 역시 동일하게 시간초과가 발생하여 다른 풀이를 참고하였습니다.

[다른 사람의 풀이]

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

문자열 형태로 정렬한 부분이 핵심이였습니다.

입력된 정수 배열(numbers)을 문자열 배열로 변환시키고 1개 자릿수~3개자릿수까지 크기인 요소마다 3번 반복시킨 뒤 정렬하는 아이디어였습니다.

이때 요소를 3번 반복한 이유로는, 문제에서 제시한 요소의 최소길이가 1자릿수이기 때문에 3자리까지 불려주고 비교하기 위함이였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글