프로그래머스_뒤에 있는 큰수 찾기

임정민·2023년 12월 20일
0

알고리즘 문제풀이

목록 보기
133/173
post-thumbnail

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

문제

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

[나의 풀이]

⌛ 시간초과 (일부 케이스 시간초과)


from collections import deque

def solution(numbers):
    answer = []
    
    max_num = max(numbers)
    length = len(numbers)
    numbers = deque(numbers)
    
    while numbers:
        
        v = numbers.popleft()
        res = -1
        
        if v==max_num:
            answer.append(res) 
            continue
            
        for num in numbers:
            if v<num:
                res = num
                break
        answer.append(res)    
        
    return answer

입력된 리스트의 요소별로, 현재 요소 뒤에 현재 요소보다 큰 요소가 있을 때 해당 값을 append하고 없다면 -1을 append하는 문제입니다.🐈🐈🐈

직관적으로 2중 for문을 활용하여 정답자체는 간단히 구현할 수 있지만 일부 케이스 시간초과가 걸렸습니다. 그리하여 deque로 선언하여 빠르게 popleft()하며 시간을 줄일 수 있었지만 여전히 3개 케이스에서 시간초과가 발생하였고 이를 해결하기 어려워 다른 풀이를 참고하였습니다.

[다른 사람의 풀이1]

def solution(numbers):
    answer = [-1]*len(numbers)
    
    stack = []
    
    for index in range(len(numbers)):
    
        target = numbers[index]
        
        while stack and numbers[stack[-1]]<target:
            answer[stack.pop()]=target
            
        stack.append(index)
                
    return answer

시간초과가 나는 2중 for문을 사용하지 않고 첫번째 for문에서 돌린 값들을 stack에 인덱스형태로 저장하여 비교하는 방식입니다.🐇🐇🐇

현재 요소(target)보다 이전 인덱스의 요소가 크다면, 이 큰 요소를 answer에 갱신하는 방식입니다.

for문 한번 시간복잡도를 이전 인덱스를 저장하는 stack으로 해결한 것이 포인트였습니다.

[다른 사람의 풀이2]

def solution(numbers):
    stack = []
    answer = [0] * len(numbers)

    for i in range(len(numbers)):
    	while stack and numbers[stack[-1]] < numbers[i]:
        	answer[stack.pop()] = numbers[i]
    	stack.append(i)
    
    while stack:
            answer[stack.pop()] = -1
    
    return answer

'다른 사람의 풀이1'과 같은 방식이되 answer를 산출해 낼 때, 현재 요소보다 큰 수가 있을 때는 미리 값을 갱신한 후 없을 때는 -1로 통일시켜 입력한 방식입니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글