Algorithem/백준 PS with code
(python) 백준 #2493 - [G5] 탑 : 스택
jamong5
2023. 7. 29. 13:48
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
유의미한 탑만 남기자
유의미한 탑은 신호가 도달할 가능성이 있는 탑이다. 자기자신보다 큰 탑에 신호가 완전히 막힌 탑은 앞으로 무의미한 탑이된다. 그런 탑들을 제외하면서 정보를 가져가면 빠르게 탐색할 수 있다.
스택을 이용해서 관리할 수 있다. 앞에서부터 탐색을 진행하면서 스택의 가장 위에 있는 탑보다 현재 탑이 더 높은 경우 스택에 있는 탑은 무의미한 탑이 되므로 pop해서 모두 제거한 뒤 현재 탑을 스택에 추가한다.
시간복잡도
시간복잡도는 O(N)으로 대략 2N정도의 탐색으로 해결할 수 있다고 생각된다.
코드
'''
Title : 탑
Link : https://www.acmicpc.net/problem/2493
Level : G5
Problem : 모든 탑의 꼭대기에서 왼쪽으로 신호를 보낸다. 신호를 받는 탑의 위치를 출력한다.
Type : 스택
Idea : 앞에서부터 검사를 진행한다. 스택에는 부딪힐 수 있는 탑들만 남긴다.
스택의 원소가 검사할 탑보다 낮다면 pop한다.
새 원소를 스택에 추가한다.
TC : O(N). 약 2N이라고 생각된다.
'''
import sys
def solution(input) :
N = int(input().rstrip())
towers = list(map(int, input().split()))
answer = [0]*N
stack = [0]
for i in range(1,N) :
while stack and towers[stack[-1]] < towers[i] :
del stack[-1]
if stack : answer[i] = stack[-1]+1
stack.append(i)
#print(*answer)
print(" ".join(map(str, answer)))
input = sys.stdin.readline
solution(input)
my solved.ac :
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac