티스토리 뷰

코딩테스트/백준

[BJ] 2493 탑

jhk828 2021. 2. 4. 21:51

2493 탑

www.acmicpc.net/problem/2493

 

2493번: 탑

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

www.acmicpc.net

// 210204 

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

public class Main_2493_탑 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int[] input = new int[N];
		for (int i=0; i<N; i++) {
			input[i] = Integer.parseInt(st.nextToken());
		}
		
		int[] ans =  new int[N];
		Stack<Integer> stack = new Stack<Integer>(); 
		Stack<Integer> index = new Stack<Integer>();  // index 저장

		for (int i=0; i<N; i++) {
			while(true) {
				if (stack.isEmpty()) {
					stack.add(input[i]); index.add(i+1);
					break;
					
				} else {
					int top = stack.pop();
					int topIndex = index.pop();
					
					if (top > input[i]) {
						ans[i] = topIndex;
						stack.add(top); index.add(topIndex);
						stack.add(input[i]); index.add(i+1);
						break;
					}
				}
			}
		} // for
		
		// 출력
		StringBuilder sb = new StringBuilder();
		for (int i=0; i<N; i++) {
			sb.append(ans[i] + " ");
		}
		System.out.println(sb.toString());
		
		br.close();
	}

}

 

 

스택을 사용하지 않으면 시간 초과가 나는 문제이다.


1. 스택이 비어있다면 왼쪽에 현재 탑보다 높은 탑이 없기 때문에 정답은 0이 된다. 자기 자신은 오른쪽 탑들의 답이 될 수 있기 때문에 자기 자신만 스택에 넣어둔다.


2. 정답으로 채택했던 높이를 스택에 넣어두고, 오른쪽으로 가며 스택을 pop하며 레이저를 수신할 수 있는지 비교한다.
  - 스택의 top이 자기 자신보다 높다면 -> 레이저를 수신할 수 있기 때문에 더 이상 비교할 필요가 없다. top과 자기 자신은 오른쪽의 다른 탑들의 정답이 될 수 있기 때문에 차례대로 다시 스택에 넣는다.
  - 스택의 top이 자기 자신보다 낮다면 -> 이제 top은 현재 위치 탑에게 막혀서 답이 될 수 없다. while문을 돌며 다음 top을 pop하며 살펴본다.

'코딩테스트 > 백준' 카테고리의 다른 글

[BJ] 1158. 요세푸스 문제  (0) 2021.02.09
[BJ] 2164번: 카드 2  (0) 2021.02.08
[BJ] 17478. 재귀함수가뭔가요  (0) 2021.02.01
[백준] 16769: Mixing Milk  (0) 2020.11.15
[백준] 9037: The candy war  (0) 2020.11.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   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
글 보관함