알고리즘/백준
백준 1863 (스카이라인 쉬운거) - java
김다미김태리신시아
2023. 9. 12. 13:40
https://www.acmicpc.net/problem/1863
1863번: 스카이라인 쉬운거
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 50,000) 다음 n개의 줄에는 왼쪽부터 스카이라인을 보아 갈 때 스카이라인의 고도가 바뀌는 지점의 좌표 x와 y가 주어진다. (1 ≤ x ≤ 1,000,000. 0 ≤ y ≤ 500,000) 첫
www.acmicpc.net
유형 : 자료구조(스택)
접근
- 건물의 개수가 증가하는 순간이 언제인가 ? -> 이것을 아는 것이 문제의 핵심이다.
- 가장 마지막의 건물보다 높이가 큰 건물이 들어왔다면 스택에 높이 저장
- 마지막의 건물보다 높이가 같은 건물이 들어왔다면 continue
- 마지막의 건물보다 높이가 작은 건물이 들어왔다면 건물의 개수 1개 증가
주의
- 측정이 종료되었을 때 스택에 저장된 개수도 전체 개수에 더해줘야 한다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
Stack<Integer> stack = new Stack<>();
int num = 0;
for(int i=1;i<=n;i++){
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
while(!stack.isEmpty()){
int tmp = stack.peek();
if(y < tmp){
stack.pop();
num += 1;
}
else if( y == tmp){
stack.pop();
}
else{
break;
}
}
if(y != 0)
stack.push(y);
}
System.out.println(num + stack.size());
br.close();
}
}