알고리즘/백준

백준 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();
    }
}