Java

[백준 1863] 스카이라인 쉬운거 (JAVA)

iheeeee6-6 2023. 8. 2. 22:52
728x90

 

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

골드 4문제로, 스택을 사용하여 문제를 풀 수 있다!

예를 들어 

1 1 

2 2

3 3

4 1

일 경우, 

앞에 있는 높이들이 현재 높이보다 크다면 

건물이 있는 것이기에 

스택에 1 ,2 ,3 을 넣고  1이 들어올 차례에

while문을 돌려서 앞에 있는 높이들 중에 1보다 큰 높이가 있는지 확인한다.

크다면, stack.pop을 하여 count+1을 한다!

그리고 포인트로는 1도 건물이기에 

별도로 while문을 돌려서 스택에 0보다 높은 것들이 있는지 확인한다.

 

+ 예시 추가 +

1 2

2 3

3 4

이렇게 있다면, 스택에는 2,3,4가 들어가고 포문이 끝난다.

그럼 별도로 while문을 돌려서 스택에 0보다 높은 것들이 있는지 확인하여 pop and count++ 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n= Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		Stack<Integer> s = new Stack<>();
		int count=0;
		StringTokenizer st;
		for(int i=0;i<n;i++) {
			st = new StringTokenizer(br.readLine());
			int idx=Integer.parseInt(st.nextToken());
			int h = Integer.parseInt(st.nextToken());
			while(!s.isEmpty()&&s.peek()>h) {
				count++;
				s.pop();
			}
			if(!s.isEmpty()&&s.peek()==h) {
				continue;
			}
			s.push(h);
		}
		
		while(!s.isEmpty()&&s.peek()>0) {count++; s.pop();}
		System.out.println(count);
	}
}

'Java' 카테고리의 다른 글

[백준 1339] 단어 수학 (JAVA)  (0) 2023.08.08
[백준 19701] 소 운전한다. (JAVA)  (0) 2023.08.03
[백준 5052] 전화번호 목록 (JAVA)  (0) 2023.07.19
[백준 2228] 구간 나누기 (JAVA)  (0) 2023.07.12
[백준 1947] 선물 전달 (JAVA)  (0) 2023.07.11