danbibibi
article thumbnail
Published 2023. 2. 14. 00:43
BOJ 2493번: 탑 카테고리 없음

문제

문제 바로가기> BOJ 2493번: 탑

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

 

풀이

stack을 이용해서 푸는 문제다! 

이전에 비슷한 문제를 풀어봤었는데,

처음 접했으면, stack으로 풀어야지라고 생각하지 못했을 것 같기도 하다.

 

현재 빌딩의 높이가 입력으로 들어올 때, 총 3가지의 경우가 있다.

 

1. stack이 비어 있는 경우

   : 레이저를 수신할 탑이 없다. 따라서, 0을 출력한다.

 

2. stack의 top이 현재 빌딩의 높이보다 큰 경우

   : stack의 top이 바로 레이저를 수신할 탑이다!

 

3. stack의 top이 현재 빌딩의 높이보다 작은 경우

   : 레이저를 수신할 탑을 찾을 때 까지 pop 해준다. 

     이 때, 스택이 비게 되는 경우, 레이저를 수신할 탑이 없는 것이므로 0을 출력한다.

 

+ 매 과정에서 현재 빌딩의 번호와, 높이를 stack에 push 해준다!

 

import java.io.*;
import java.util.*;

public class Main {
	
	static StringBuilder sb = new StringBuilder();
	static int N;

	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		// 각각의 탑에서 발사한 레이저 신호를 어느 탑에서 수신하는지
		// 레이저 신호를 수신하는 탑이 존재하지 않으면 0을 출력
		
		int height=0;
		Deque<int[]> stack = new ArrayDeque<>(); //num, height
		for(int i=1; i<=N; i++) {
			height = Integer.parseInt(st.nextToken());
			if(stack.isEmpty()) sb.append(0 + " ");
			else if(stack.peekLast()[1] > height) sb.append(stack.peekLast()[0] + " ");
			else {
				while(!stack.isEmpty() && stack.peekLast()[1] <= height) stack.pollLast();
				if(stack.isEmpty()) sb.append(0 + " ");
				else sb.append(stack.peekLast()[0] + " ");
			}
			stack.offer(new int[] {i, height});
		}
		System.out.println(sb.toString());
	}
}
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로