https://www.acmicpc.net/problem/3015
3015번: 오아시스 재결합
첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다. 사람
www.acmicpc.net
백준 - 오아시스 재결 (PATRIK) (3015번)
난이도 : Platinum 5
알고리즘&자료구조 : Stack (스택)
스택을 활용해서 풀 수 있는 문제이다.
Stack으로 오름차순의 순열을 유지하며 해결할 수 있는
전형적인 스택 문제였다.
< 전체 코드 >
import sys
input = sys.stdin.readline
class Waitings():
def __init__(self, N):
pairs = 0
stack = []
for _ in range(N):
x = int(input())
while stack and stack[-1][0] < x:
_, acc = stack.pop()
pairs += acc
if stack and stack[-1][0] == x:
pairs += stack[-1][1]
stack[-1][1] += 1
if len(stack) > 1:
pairs += 1
else:
if stack:
pairs += 1
stack.append([x, 1])
self.answer = pairs
if __name__ == '__main__':
wating_line = Waitings(int(input()))
print(wating_line.answer)
① 스택으로 활용할 리스트 stack을 생성한다.
서로 볼 수 있는 쌍의 개수를 셀 pairs를 0으로 초기화한다.
② 각 사람의 높이 x를 입력받는다.
x가 stack의 마지막 원소보다 작을 때까지,
while stack and stack[-1][0] < x
stack의 마지막 원소를 계속 제거한다.
_, acc = stack.pop()
그 과정에서 제거하는 높이의 사람 수를 pairs에 더한다.
pairs += acc
③ 만약 x와 같은 높이의 사람들이 stack에 존재한다면,
pairs에 그 사람들의 수를 더해주고,
stack에 남아있는 해당 높이의 사람 수에 1을 더해준다.
만약 x보다 큰 높이의 사람들이 stack에 남아있다면,
pairs에 1을 추가로 더해준다.
if stack and stack[-1][0] == x:
pairs += stack[-1][1]
stack[-1][1] += 1
if len(stack) > 1:
pairs += 1
④ x와 높이가 같은 사람이 stack에 없으면서
stack에 x보다 높이가 높은 사람이 남아있다면,
pairs에 1을 추가로 더해준다.
이후 stack에 [현재 사람 높이 x, 사람 수 1] = [x, 1] 을 추가해준다.
else:
if stack:
pairs += 1
stack.append([x, 1])
⑤ 마지막으로 pairs를 출력하면 된다.
'Algorithm' 카테고리의 다른 글
이항 계수 3 (11401번) - 백준 (BOJ) (0) | 2023.07.29 |
---|---|
Contact (1013번) - 백준 (BOJ) (0) | 2023.07.28 |
거의 최단 경로 (5719번) - 백준 (BOJ) (0) | 2023.07.28 |
철로 (13334번) - 백준 (BOJ) (0) | 2023.07.27 |
약수의 합 (17425번) - 백준 (BOJ) (0) | 2023.07.26 |