[백준 2493번] 탑
1. 코드
import sys
from collections import defaultdict
n = int(input())
arr = list(map(int, sys.stdin.readline().rstrip().split()))
d = defaultdict(int)
answer = [0]
max_val = arr[0]
stack = [(1, max_val)]
for tower, height in enumerate(arr[1:], 2):
if height >= max_val:
max_val = height
stack.clear()
stack.append((tower, height))
else:
receive_tower_idx = len(stack) - 1
while stack and stack[-1][1] <= height:
stack.pop()
receive_tower_idx -= 1
stack.append((tower, height))
d[tower] = stack[receive_tower_idx][0]
for i in range(1, n + 1):
print(d[i], end=' ')
2. 후기
import sys
from collections import defaultdict
n = int(input())
arr = list(map(int, sys.stdin.readline().rstrip().split()))
d = defaultdict(int)
answer = [0]
max_val = arr[0]
stack = [(1, max_val)]
for tower, height in enumerate(arr[1:], 2):
if height >= max_val:
max_val = height
stack.clear()
stack.append((tower, height))
else:
receive_tower_idx = len(stack) - 1
while stack and stack[-1][1] <= height:
stack.pop()
receive_tower_idx -= 1
stack.append((tower, height))
d[tower] = stack[receive_tower_idx][0]
for i in range(1, n + 1):
print(d[i], end=' ')
stack 유형의 문제에서 while 문과 stack의 마지막 항을 비교하는 방식은 자주 사용된다.
receive_tower_idx = len(stack) - 1 값만 잘 찾으면 풀 수 있다.
Author And Source
이 문제에 관하여([백준 2493번] 탑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@legowww/백준-2493번-탑저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)