백준 - 2493 : 탑 [자바]

HungAh.log·2021년 8월 5일
0
post-custom-banner
  1. 일직선 위에 N개의 높이가 서로 다른 탑을 수평 직선의 왼쪽부터 오른쪽 방향으로 차례로 세운다.
    2. 각 탑의 꼭대기에 레이서 송신기 설치
  2. 모든 탑의 레이저 송신기는 레이저 신호를 지표면과 평행하게 수평 직선의 왼쪽 방향으로 발사
    4. 탑의 기둥 모두에는 레이저 신호 수신 장치 설치되어 있음
  3. 하나의 탑에서 발사된 레이저 신호는 가장 먼저 만나는 단 하나의 탑에서만 수신 가능
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine()); // 탑 개수

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		ArrayDeque<Integer> stack = new ArrayDeque<>(); // 탑 담을 스택
		ArrayDeque<Integer> index = new ArrayDeque<>(); // 현재 탑의 인덱스 담을 스택

		for (int i = 1; i <= N; i++) {
			int n = Integer.parseInt(st.nextToken()); // 탑 높이 하나씩 읽기
			if (stack.isEmpty()) { // 스택이 비어있다면
				sb.append("0 "); // 레이저를 받을 곳이 없으니 0
				stack.push(n); // 현재 탑 넣기
				index.push(i); // 현재 탑의 인덱스 넣기
			} else {// 스택이 비어있지 않다면
				while (true) { //
					if (stack.isEmpty()) { // 스택이 비어있다면 위와 같음
						sb.append("0 ");
						stack.push(n);
						index.push(i);
						break; // 멈추기
					}
					if (stack.peek() > n) { // 바로 앞의 탑이 현재 탑의 높이보다 높다면
						sb.append(index.peek()).append(" ");// 그 인덱스 출력
						stack.push(n); // 현재 탑 넣기
						index.push(i); // 현재 탑의 인덱스 넣기
						break;
					} else { // 바로 앞의 탑이 현재 탑의 높이보다 낮다면 앞의 탑에 도달할 일이 없으니
						stack.pop(); // 탑 없애기
						index.pop(); // 그 탑의 인덱스도 없애기
					}
				}
			}
			// sb.append("0 ");
		}
		System.out.println(sb);
		br.close();
	}
}
profile
👩🏻‍💻
post-custom-banner

0개의 댓글