Post

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.