스택 - 탑문제
1. 현재 학습 진도
3-5 스택부분 수강
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)강사님께서 구현해주신 코드에 입력값을 사용자가 지정하게만 바꿔서 백준문제를 풀어보려고 했는데, 시간초과가 납니다.
제가 혹시 코드에 실수한 부분이 있는지 궁금합니다.
답변 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)))이 개선된 알고리즘은
각 탑을 한 번씩만 처리합니다
스택에는 레이저 신호를 수신할 가능성이 있는 탑의 정보만 유지합니다
불필요한 비교를 피해 시간복잡도를 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





