시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 16855 | 4283 | 3212 | 25.579% |
오아시스의 재결합 공연에 N명이 한 줄로 서서 기다리고 있다.
이 역사적인 순간을 맞이하기 위해 줄에서서 기다리고 있던 백준이는 갑자기 자기가 볼 수 있는 사람의 수가 궁금해 졌다.
두 사람 A와 B가 서로 볼 수 있으려면, 두 사람 사이에 A 또는 B보다 키가 큰 사람이 없어야 한다.
줄에 서있는 사람의 키가 주어졌을 때, 서로 볼 수 있는 쌍의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000)
둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다.
사람들이 서 있는 순서대로 입력이 주어진다.
서로 볼 수 있는 쌍의 수를 출력한다.
7
2
4
1
2
2
5
1
10
Olympiad > Croatian Highschool Competitions in Informatics > 2007 > Croatian Olympiad in Informatics 2007 1번
문제를 번역한 사람: baekjoon
자료 구조
스택
import java.io.*;
import java.util.Stack;
public class Main {
public static int n;
public static long cnt;
public static class Node {
int h, cnt;
Node(int h, int cnt) {
this.h = h;
this.cnt = cnt;
}
}
public static Stack<Node> stk;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
stk = new Stack<Node>();
for(int i = 0; i < n; i++) {
int height = Integer.parseInt(br.readLine());
Node cur = new Node(height, 1);
while(!stk.isEmpty() && stk.peek().h <= height) {
Node top = stk.pop();
cnt += top.cnt;
if(top.h == height) {
cur.cnt += top.cnt;
}
}
if(!stk.isEmpty()) {
cnt++;
}
stk.push(cur);
}
bw.write(String.valueOf(cnt));
bw.flush();
bw.close();
br.close();
}
}
스택 문제는 특히 생각해내는게 어려운것 같다. 이번 문제도 구글링의 도움을 받았다...
반복문을 돌면서 스택에 push 되는 원소의 관점에서 생각해보는 습관을 길러야할 것 같다.
이 문제에서도 줄을 서는 사람의 관점에서 그 앞에 사람들이 키 내림차순으로 줄을 서있을 경우 서로 마주볼 수 있게 되는 원리를 이용했다.