inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

섹션4. 3주차 Stack 백준 2493

해결된 질문

119

zz gg

작성한 질문수 1

0

1. 현재 학습 진도

 

2. 어려움을 겪는 부분

선생님이 알려준 내용대로 이해하고 제출했으나 3개모두 시간초과가 뜹니다. pypy로 바꿔서도 해봣네용

스택 학습이 우선적이기에 의도했다고 하더라도(제가 잘못 한걸 수도 있습니다!!!1)

시간초과가 뜨지않길 원합니다, 어떻게 코드를 수정해야할까요

image.png

 

 

3. 시도해보신 내용

 

 첫번째콛, -내가 작성

n=int(input())

# 한 줄로 입력 받기
data = input().strip()
numbers = list(map(int, data.split()))
result=[]


for i in range(n-1,-1,-1):
    cur_idx=i
    for j in range(i-1,-1,-1):
        if numbers[i]<numbers[j]:
            result.append(j+1)
            break
        elif j==0:
            result.append(0)
result.append(0)

while result:
    print(result.pop(),end=" ")

나머지코드- 딩코님의 작성

n=int(input())

# 한 줄로 입력 받기
data = input().strip()
top_heights= list(map(int, data.split()))

def get_receiver_top_orders(heights):
    answer = [0] * len(heights)
    while heights:
        height = heights.pop()
        for idx in range(len(heights) - 1, -1, -1):
            if height <= heights[idx]:
                answer[len(heights)] = idx + 1
                break
    return answer


print(get_receiver_top_orders(top_heights))  # [0, 0, 2, 2, 4] 가 반환되어야 한다!
n=int(input())

# 한 줄로 입력 받기
data = input().strip()
top_heights= list(map(int, data.split()))


def get_receiver_top_orders(heights):
    answer = [0] * len(heights)
    while heights:
        height = heights.pop()
        for idx in range(len(heights) - 1, -1, -1):
            if height <= heights[idx]:
                answer[len(heights)] = idx + 1
                break
    return answer


print(get_receiver_top_orders(top_heights))  # [0, 0, 2, 2, 4] 가 반환되어야 한다!

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊

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

답변 1

0

딩코딩코

안녕하세요 zz gg 님 좋은 질문 감사드립니다!

 

해당 문제 풀이의 경우 말씀해주신대로 시간 초과가 발생하고 있습니다! 해당 코드는 코드는 스택의 기본 개념을 이해하기 위한 학습용 구현이었기 때문에 그렇습니다. 실제로 이 코드는 O(N²) 시간 복잡도를 가져서 큰 입력값에서는 시간 초과가 발생할 수 있습니다!

 

따라서, 시간 복잡도를 개선하려면 다음과 같이 스택을 좀 더 효율적으로 활용할 수 있습니다

def get_receiver_top_orders(heights):
    stack = []  # [인덱스, 높이]를 저장
    answer = [0] * len(heights)
    
    for i in range(len(heights)):
        while stack and stack[-1][1] <= heights[i]:
            stack.pop()
        if stack:
            answer[i] = stack[-1][0] + 1
        stack.append([i, heights[i]])
    
    return answer

 

이 방식의 핵심 아이디어는 다음과 같습니다.

  1. 스택에 [인덱스, 높이]를 함께 저장하여 나중에 다시 순회할 필요를 없애기

  2. 현재 탑보다 작은 탑들은 스택에서 모두 제거 (어차피 앞으로도 쓸모없음)

  3. 남아있는 스택의 top이 수신 가능한 가장 가까운 탑

이렇게 하면 각 탑이 최대 한 번씩만 스택에 들어갔다 나오므로 O(N) 시간 복잡도로 문제를 해결할 수 있습니다. 이에 대한 풀이 방법은 추가적으로 문서에 서술해두도록 하겠습니다! 좋은 아이디어 주셔서 감사합니다 🙇

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

0

53

2

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

0

36

2

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

0

40

2

LinkedList 과제 Fast, slow 포인터

0

48

2

투포인터 시간복잡도

0

49

2

수강평 작성 후 자료

0

49

2

수업교재 링크 오류

2

105

2

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

0

124

2

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

0

68

2

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

0

80

2

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

0

84

2

수업자료 pdf 받고싶습니다

0

102

2

강의 자료 오류 수정

0

69

1

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

0

60

2

3-8 해쉬 -2

0

47

2

Linked List Element Delete Explanation Problem

0

63

2

강의3-4 스택 탑 문제

0

73

2

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

0

97

3

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

0

73

2

1874 - 스택 문항

0

79

2

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

0

96

2

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

0

105

2

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

1

181

3

들여쓰기가 햇갈리네요

0

118

2