코딩테스트

백준 스카이라인(1863번)

코드 죄수 2022. 8. 30. 00:12

알고리즘

높이가 0인 건물이 들어온다면 스택을 초기화 함

현재 건물보다 낮은 건물이 들어온다면 입력받은 건물의 높이보다 큰 건물을 pop함

현재 건물보다 높이가 크다면 카운트 증가함

건물의 높이가 같다면 continue로 입력받은 건물을 스택에 넣지 않음

스택이 비어있다면 카운트 증가 

 

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 num = Integer.parseInt(br.readLine());	
		Stack<Integer> s = new Stack<Integer>();
		StringTokenizer st;
		int number,height; 
		int count=0;
		for (int i =1; i<= num; i++) {	
			st = new StringTokenizer(br.readLine());
			number = Integer.parseInt(st.nextToken());	
			height = Integer.parseInt(st.nextToken());	
			if(height == 0) {	// 건물의 높이가 0이라면 
				s.clear();	// 스택 초기화
			}else {	// 건물의 높이가 0이 아니라면
				while(!s.empty() && s.peek()>height) {	// 현재 건물보다 입력 받은 건물이 낮을시 
					s.pop();	//입력 받은 건물 보다 큰 건물 제외
				}
				if(!s.empty() &&s.peek()<height) {	// 현재 건물보다 입력받은 건물이 높을시
					count++;	// 카운트 증가
				}
				if(!s.empty() &&s.peek() == height) {	// 건물의 높이가 같을시
					continue;	//높이가 같다면 같은 건물 취급으로 스택에 넣지 않음
				}
				if(s.empty()) {	// 스택이 비어있다면
					count++;	//카운트 증가
				}
				s.push(height);	//건물의 높이를 스택에 넣기
			}
		}
		System.out.println(count);	//총 건물의 카운트 출력
	}
}