[백준/java] 1863. 스카이라인 쉬운거

somyeong·2023년 1월 15일
0

코테 스터디

목록 보기
52/52

문제 링크 - https://www.acmicpc.net/problem/1863

🌱 문제


🌱 풀이

  • 어떻게 풀어야 할지 막막해서 백준 힌트를 통해 스택으로 푸는 것이라는걸 알아냈지만 그 이후에도 감이 안와서 구글링을 참고 하였다.
  • 다음과 같은 규칙을 찾아내고, 이 과정을 stack을 이용하여 구현아였다.

규칙

  1. 높이가 높아지면 스택에 push
  2. 높이가 낮아지면 그 높이보다 높은 건물들의 넓이가 끝나서 그 만큼 스택에서 뽑고 ans++
    • 만약 새로운 높이라면 스택에 push
    • 원래 있던 높이라면 continue
  3. 0이란 높이는 저장할 필요 없으므로 stack을 비우면서 ans++
  4. stack이 비어있으면 무조건 push
  5. 모든 탐색이 끝나면 stack을 비우면서 ans++

🌱 코드

package _2023.Jan_week02;

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

// 1863. 스카이라인 쉬운거 
public class boj_1863 {
	static int n;
	static int answer;
	static int[] height;
	public static void main(String[] args) throws IOException{

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n=Integer.parseInt(br.readLine());
		height = new int[n];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			height[i]=Integer.parseInt(st.nextToken());
			
		}
		Stack<Integer> stack = new Stack<>();
		for(int h :height ) {
			// 0을 저장하면 안되므로 스택을 비움 
			if(h==0) {
				answer+=stack.size();
				stack.clear();
			}
			else if(!stack.isEmpty()) {
				int peek=stack.peek();
				// 높이가 높아지면 스택에 Push
				if(peek<h) {
					stack.push(h);
				}else {
					//높이가 낮아지면 그 높이보다 높은 건물들을 스택에서 꺼냄 
					while
						(!stack.isEmpty() && stack.peek()>h) {
						stack.pop();
						answer++;
					}
					// 스택에 없는 새로운 높이라면 Push
					if(!stack.isEmpty() && stack.peek()<h)
						stack.push(h);
					if(stack.isEmpty())
						stack.push(h);
				}
			}else {
				// 스택이 비어있으면 무조건 push
				stack.push(h);
			}
		}
		answer += stack.size();
		stack.clear();
		System.out.println(answer);
		
		
	}

}
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글