백준
백준 3015 오아시스 재결합 (파이썬)
MC류짱
2022. 12. 14. 16:56
풀이 및 해설(주석)
import sys
N = int(sys.stdin.readline().strip())
S = []
rst = 0
for _ in range(N):
hei = int(sys.stdin.readline().strip())
# 스택이 있고 그 스택의 마지막의 키가 나보다 작으면 그 수를 pop과 rst에 +
# pop하는 경우는 나와 이어지는 경우임
while S and S[-1][0] < hei:
rst += S.pop()[1]
# 스택이 빈 경우 그냥 넣어주기
if not S:
S.append([hei, 1])
# 스택의 마지막 키가 나와 같은 경우, 일단 pop해서 그 수를 rst에 더해주고
elif S and S[-1][0] == hei:
cnt = S.pop()[1]
rst += cnt
# 이때 스택이 남아있다면, 나와 그 스택안의 값이 이어지므로 +1
if S:
rst += 1
# 내 키와 현재 그 키의 수를 +1해서 스택에 append
S.append([hei, cnt + 1])
# 스택이 비어있지 않고, 위의 조건에 만족하지 못할 때, 내 키와 수=1 을 추가하고 rst에 1추가(나와 스택안의 이어짐)
else:
S.append([hei, 1])
rst += 1
print(rst)
후기
- 지금까지 푼 스택 문제들과 비슷하면서 살짝 관점이 달라서 그걸 이해하는데 시간이 좀 걸린 문제
- 처음에는 while문을 돌리며 그냥 작으면 더해주면 되지 않나 싶었지만, while S and S[-1] <= hei
- 이렇게 되면 예를 들어 4, 1, 2, 2, 5 이런 식으로 키가 있으면,
- 5차례에서 2를 두 번 볼 수 있어야 되는데 2를 한 번 밖에 볼 수가 없음
- 그래서, 같은 키일 때 따로 처리를 해줘야되는 문제