inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

38군데 합격 비법, 2026 코딩테스트 필수 알고리즘

3-5. 스택

스택 - 탑문제

해결된 질문

164

수빈 오

작성한 질문수 3

1

1. 현재 학습 진도

 

2. 어려움을 겪는 부분

백준 탑 문제를 강사님께서 구현해주신  코드로
풀어보고 있는데 강사님 코드를 사용하면
시간초과가 나는 것 같습니다.

3. 시도해보신 내용

 

N = int(input())
tops = list(map(int, input().split()))


def top_stack(N):
    result = [0] * N
    while tops:
        cur_top = tops.pop()
        for i in range(len(tops) - 1, -1, -1):
            if cur_top <= tops[i]:
                result[len(tops)] = i + 1
                break
                
    print(' '.join(map(str,result)))


top_stack(N)

강사님께서 구현해주신 코드에 입력값을 사용자가 지정하게만 바꿔서 백준문제를 풀어보려고 했는데, 시간초과가 납니다.
제가 혹시 코드에 실수한 부분이 있는지 궁금합니다.

python 코딩-테스트 알고리즘 data-structure

답변 1

0

딩코딩코

수빈님 오랜만에 질문 탭에서 뵙는 것 같습니다

벌써 겨울이 지나고 봄인데 잘 지내시죠?? 좋은 질문 주셔서 감사합니다!!


강의에서 제시되었던 코드는 반복문에서 스택을 사용하도록 변경한 코드라서, 실제로 큰 입력값을 처리하기에는 효율적이지 않습니다!

현재 코드의 시간복잡도는 O(n²)으로:

  • 각 탑마다 (while heights:)

  • 이전의 모든 탑을 순회하며 확인합니다 (for idx in range(len(heights) - 1, -1, -1):)

백준과 같은 알고리즘 문제 사이트에서는 보다 효율적인 O(n) 알고리즘이 필요합니다. 아래는 스택을 활용한 개선된 코드입니다

def top_stack(N, tops):
    result = [0] * N
    stack = []  # (인덱스, 높이) 저장
    
    for i in range(N):
        # 현재 탑보다 낮은 탑은 스택에서 제거
        while stack and stack[-1][1] < tops[i]:
            stack.pop()
        
        # 스택이 비어있지 않다면, 가장 위의 탑이 수신 탑
        if stack:
            result[i] = stack[-1][0] + 1  # 인덱스는 0부터 시작하므로 +1
        
        # 현재 탑을 스택에 추가
        stack.append((i, tops[i]))
    
    return result

# 백준 제출용 코드
N = int(input())
tops = list(map(int, input().split()))
result = top_stack(N, tops)
print(' '.join(map(str, result)))

이 개선된 알고리즘은

  1. 각 탑을 한 번씩만 처리합니다

  2. 스택에는 레이저 신호를 수신할 가능성이 있는 탑의 정보만 유지합니다

  3. 불필요한 비교를 피해 시간복잡도를 O(n)으로 개선합니다

 

해당 개선 방식에 대해서 추가적으로 교재에서 다뤄봐도 좋을 것 같습니다!

추후에 알고리즘 영상을 보완하는 시점에 해당 문제 풀이 방법에 대해서도 작성해보도록 하겠습니다

강의 개선 아이디어 주심에 대한 감사의 의미로 커피 기프티콘을 드리겠습니다 아래 카카오톡 오픈 링크로 연락 부탁드립니다!!

https://open.kakao.com/me/ding_coding_co

감사합니다

수강평 이벤트

0

33

2

코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요

0

66

2

3-3 정렬-2 선택정렬 로직

0

42

2

링크드 리스트 끝에서 k번째 값 출력하기

0

45

2

LinkedList 과제 Fast, slow 포인터

0

50

2

투포인터 시간복잡도

0

52

2

수강평 작성 후 자료

0

53

2

수업교재 링크 오류

2

114

2

프로그래머스에서 제출 후 채점시 틀림ㅠ

0

130

2

1-10 알고리즘 더 풀어보기(2) 질문 있습니다

0

74

2

문제 풀이 방식 관련 질문입니다!

0

85

2

1-5 알고리즘과 친해지기 (2) - 최빈값찾기 질문 있습니다

0

91

2

수업자료 pdf 받고싶습니다

0

106

2

강의 자료 오류 수정

0

75

1

2-10 더하거나 빼거나 관련 질문입니다

0

63

2

3-8 해쉬 -2

0

49

2

Linked List Element Delete Explanation Problem

0

68

2

강의3-4 스택 탑 문제

0

74

2

코드스니펫 입출력 케이스에 오류가 있는것 같아요

0

99

3

링크드 리스트 원소 찾기 구현 방식 질문드립니다.

0

75

2

1874 - 스택 문항

0

81

2

DP Java 예제 자료형 오버플로우 문제

0

100

2

4-9 4주차 숙제중 농심라면 문제

0

111

2

DFS 에서 스택을 사용하는 이유

1

187

3