BOJ 3015 오아시스 재결합
BOJ 3015 오아시스 재결합
https://www.acmicpc.net/problem/3015
문제
오아시스의 재결합 공연에 N명이 한 줄로 서서 기다리고 있다.
이 역사적인 순간을 맞이하기 위해 줄에서 기다리고 있던 백준이는 갑자기 자기가 볼 수 있는 사람의 수가 궁금해졌다.
두 사람 A와 B가 서로 볼 수 있으려면, 두 사람 사이에 A 또는 B보다 키가 큰 사람이 없어야 한다.
줄에 서 있는 사람의 키가 주어졌을 때, 서로 볼 수 있는 쌍의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000)
둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다.
사람들이 서 있는 순서대로 입력이 주어진다.
출력
서로 볼 수 있는 쌍의 수를 출력한다.
예제 입력 1
7 2 4 1 2 2 5 1
예제 출력 1
10
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
// height는 사람의 키, count는 동일한 신장의 사람 수를 의미
static class Person {
int height, count;
public Person(int height, int count) {
this.height = height;
this.count = count;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Person> deque = new ArrayDeque<>();
long answer = 0;
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
int input = Integer.parseInt(br.readLine()), count = 1;
// 입력받은 신장보다 큰 사람만 덱에 남을 때까지 pop하며 동일한 신장의 사람 수(count)를 계산
while (!deque.isEmpty() && deque.peek().height <= input) {
Person check = deque.pop();
if(check.height == input) count += check.count;
answer += check.count;
}
// 덱이 비어있지 않으면 가장 최근에 push된 사람과 현재 입력받은 사람이 볼 수 있으므로 answer++
if(!deque.isEmpty()) answer++;
deque.push(new Person(input, count));
}
System.out.println(answer);
}
}
This post is licensed under CC BY 4.0 by the author.