동캄의 코딩도장

프로그래머스 level2 [뒤에 있는 큰 수 찾기] 파이썬 본문

코테/프로그래머스

프로그래머스 level2 [뒤에 있는 큰 수 찾기] 파이썬

동 캄 2023. 4. 5. 23:33

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

# 프로그래머스 level2 뒤에 있는 큰 수 찾기
def solution(numbers):
    answer = [-1] * (len(numbers)) #전체 -1로 세팅
    stack=[] #값을 임시로 저장할 스택
    for i in range(len(numbers)-1):
        now=numbers[i] #현재 값
        next=numbers[i+1] #다음 값
        if now>=next: #현재 값 >= 다음 값 이면
            stack.append((i,now)) # 스택에 현재 인덱스, 현재 값 저장
        else: #현재 값< 다음 값이면
            answer[i]=next #answer[i]에 다음 값 저장
            while stack: # 스택이 있다면
                idx,val=stack.pop() #스택의 값을 pop 해서
                if val<next: #값이 다음 값(i+1번째 값)보다 작으면
                    answer[idx]=next # answer[idx]값 갱신
                else:
                    stack.append((idx,val)) # 그렇지 않다면, 다시 스택에 삽입
                    break
    return answer

# print(solution([2,3,3,5]))
# print(solution([9, 1, 5, 3, 6, 2]))

스택이 생각이 안나서 헤맸다... 

모든 인자를 한 번씩 stack에 넣고, 조건(stack[-1]<numbers[i])이 만족되면 pop 해주면 되는 문제였다.

 

더욱 깔끔하게 푸신 분의 풀이를 첨부한다.

def solution(numbers):
    stack = []
    result = [-1] * len(numbers)
    for i in range(len(numbers)):
        while stack and numbers[stack[-1]] < numbers[i]:
            result[stack.pop()] = numbers[i]

        stack.append(i)

    return result