Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 2493] 탑 (Java) 본문

Problem Solving

[BOJ 2493] 탑 (Java)

흑개 2022. 2. 7. 20:14

https://www.acmicpc.net/problem/2493

 

2493번: 탑

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

www.acmicpc.net

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

public class Main {
	static int N;
	static Stack<Node> stack=new Stack<>();
	static int[] arr;
	static int[] ans;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		arr=new int[N+1];
		ans=new int[N+1];
		for (int i=1; i<=N; i++) {
			arr[i]=Integer.parseInt(st.nextToken());
		}
		stack.push(new Node(1,arr[1]));
		for (int i=2; i<=N; i++) {
			while (!stack.isEmpty()) {
				if (stack.peek().val>=arr[i]) {
					ans[i]=stack.peek().num;
					break;
				}
				else {
					stack.pop();
				}
			}
			stack.push(new Node(i,arr[i]));
			
		}
		for (int i=1; i<=N; i++) {
			System.out.print(ans[i]+" ");
		}
		
	}
	static class Node{
		int num;
		int val;
		private Node(int num, int val) {
			this.num = num;
			this.val = val;
		}
		
	}

}

아이디어를 떠올리기가 쉽지 않아 힌트를 참고했다.

1번째 수를 먼저 스택에 넣어 준다. 

2번째부터 N번째 수까지, 다음과 같은 과정을 반복한다.

1. 자기보다 크거나 같은 값이 있으면 멈추고 값을 저장한다.

2. 자기보다 작은 값이 있으면 스택에서 pop 시킨다.

멈추거나 스택이 비게 되면, 자기 값을 스택에 넣는다.