# 2493번 탑
from collections import deque
N = int(input())
arr = list(map(int,input().split()))
result = [0]*N
stack = deque()
for ind in range(N):
while stack and stack[len(stack)-1][1] < arr[ind]:
stack.pop()
if stack:
result[ind] = stack[len(stack)-1][0]
else:
result[ind] = 0
stack.append((ind+1,arr[ind]))
print(*result)
이 문제는 스택을 이용해 구현하는 문제인데, 스택과 큐와 같은 기본이 좀 부실하다보니 푸는데 어려움을 겪었던 문제였다.
첫 풀이는 앞에서부터 탐색하는 방식이다.
스택에는 앞에서부터 차근차근 인덱스와 탑의 높이를 넣어놓는다.
그리고 스택에 놓여져있을때, 스택의 마지막 값이 탐색하는 탑의 높이보다 크거나 같을때 까지 계속 pop을 해준다.
그리고 만약에 스택이 남아있으면 마지막 값을 결과값에 넣어주고, 아니면 0을 넣어준다.
예를 들어 설명하겠다.
7 3 5 9 2 8 이 있다고 하자
tower : 7 3 5 6 2 8
ind : 0
stack : []
result : [0,0,0,0,0,0]
처음에는 stack이 비어져있고, 가장 첫번째는 무조건 0이기 때문에 stack에 현재 타워의 index와 높이를 넣어준다.
tower : 7 3 5 9 2 8
ind : 1
stack : [(1,7)]
result : [0,1,0,0,0,0]
다음 타워는 높이가 3인데 스택의 끝에 있는 타워보다 높이가 낮기 때문에 그대로 수신이 가능하다. 그래서 결과에는 스택의 마지막에 있는 타워의 index를 넣어주고 stack에 넣어준다.
tower : 7 3 5 9 2 8
ind : 2
stack : [(1,7),(2,3)]
result : [0,1,1,0,0,0]
여기서 봐보면 현재 tower의 높이는 5이다. 하지만 stack에 끝에 있는 타워의 높이는 3이다. 그러면 이 tower에는 절대 다른 타워에서 수신을 할 수 없다. 왜냐하면 높이가 5인 타워가 높이가 3인 타워를 가리기 때문에, 신호를 수신할 수 없다. 그렇기 때문에 stack에서 없애주고, 그 다음 끝값과 비교한다. 여기서는 현재타워의 높이가 5이고, 스택의 마지막은 7이기 때문에 1번째 타워에서 신호가 수신이 가능하고, stack에 넣어준다.
tower : 7 3 5 9 2 8
ind : 3
stack : [(1,7),(3,5)]
result : [0,1,1,0,0,0]
위와 같은 방식으로 하면 스택내에는 현재 타워의 높이인 9보다 높은 타워가 없기 때문에 스택이 전부 비워지고, 결과값에는 0을 넣어줄 수 있다
tower : 7 3 5 9 2 8
ind : 4
stack : [(4,9)]
result : [0,1,1,0,4,0]
현재 타워의 높이가 2이므로 스택의 끝값보다 작기 때문에 수신이 가능하다. 그리고 스택에 넣어주면 된다.
tower 7 3 5 9 2 8
ind : 5
stack : [(4,9),(5,2)]
result : [0,1,1,0,4,4]
똑같이 진행해주면 된다.
위와 같이 스택의 특성을 알고, 하나하나 진행해주면 쉬운 문제인데, 알고리즘 기초인 스택과 큐에 대해서 약하다보니 오래걸렸던 문제이다.
N = int(input())
arr = list(map(int,input().split()))
result = [0]*N
stack = []
for ind in range(N-1,-1,-1):
while stack and arr[stack[-1]] < arr[ind]:
result[stack.pop()] = ind + 1
stack.append(ind)
print(*result)
이 방법은 끝에서부터 진행하는 방법이다. stack에 인덱스를 넣어주고 거꾸로 오면서 stack에 끝에 있는 값이 현재의 타워보다 작을때, 그때 stack에서 꺼내서 결과값에 저장하는 방식이다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 11758 CCW (0) | 2021.02.16 |
---|---|
[BOJ/백준] 5557 1학년 (0) | 2021.02.16 |
[BOJ/백준] 1915 가장 큰 정사각형 (0) | 2021.02.16 |
[BOJ/백준] 2225 합분해 (0) | 2021.02.16 |
[BOJ/백준] 3190 뱀 (0) | 2021.02.16 |