문제: https://www.acmicpc.net/problem/3015
import sys
read = lambda : sys.stdin.readline().strip()
n = int(read())
stack = []
# stack은 각 지점에 왔을 때 높이를 비교할 대상들이 들어있는 곳
# 크기가 큰 것들이 밑에 있다.
ans = 0
for _ in range(n):
print(stack)
x = int(read())
while stack and stack[-1][0] < x:
# while문은 stack의 값중에서 x보다 작은 값인 애들은 다 뺀다.
# 왜냐면 뒤에서 x 에 의해 가려지는 애들이어서 stack에 들어있을 이유가 없다.
# x보다 작은 값들은 다 빼면서 매번 +1씩 한다. 왜냐면 그 애들은 x와 마주볼 수 있기 때문이다.
ans+= stack.pop()[1]
if stack and stack[-1][0] == x:
# 같은게 있으면 cnt를 1씩 늘리는게 이 분기문이 하는 일
cnt = stack.pop()[1]
ans+= cnt
# 2 2 2있으면 젤 앞에 2는 젤 끝에 2를 볼 수 있기 때문에 이렇게 한다.
if len(stack) != 0 :
ans += 1
# 바로 직전의 애와 마주볼 수 있으므로 +1
stack.append((x, cnt+1))
else:
# stack의 top이 x보다 더 크다! 뒤에 오는 애들이 현재 값과 stack의 값을 동시에 볼 수도 있기 때문이다.
if len(stack) != 0 :
ans += 1
# 바로 직전의 애와 마주볼 수 있으므로 +1
stack.append((x, 1))
'''
밑에 if문을 코드에 넣으려면 바로 직전의 if/else문에서
if len(stack) != 0 :
ans += 1
이부분을 빼야한다.
if stack and stack[0][0] > x:
# stack의 값중에서 x보다 작은 값인 애들은 이미 사전에 빼서 [5 3] 에 4가 되서 문제가 될 것을 걱정할 필요가 없다.
# 그냥 보면 이해가 안되지만 사실은 마주보는 애들의 값을 더하기 위해서 놓은 것이다.
ans+= 1
'''
print(ans)