λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
2️⃣ Java/Problem Solving

[Java Algorithm] 탑 BOJ #2493

by seolhee2750 2022. 8. 5.
문제

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

 

2493번: 탑

첫째 쀄에 νƒ‘μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N이 주어진닀. N은 1 이상 500,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” N개의 νƒ‘λ“€μ˜ 높이가 직선상에 놓인 μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 주어진닀. νƒ‘λ“€μ˜ λ†’μ΄λŠ” 1

www.acmicpc.net

 

λ‚΄ 문제 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class BOJ_2493 {

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder out = new StringBuilder();
		
		st = new StringTokenizer(in.readLine());
		int n = Integer.parseInt(st.nextToken());
		
		int[] result = new int[n];
		Deque<int[]> que = new ArrayDeque<>();
		st = new StringTokenizer(in.readLine());
		
		for(int i = 0; i < n; i++) {
			int now = Integer.parseInt(st.nextToken());
			if(i == 0 || que.size() == 0) {
				result[i] = 0;
				que.add(new int[]{i, now});
				continue;
			}
			else {
				// 이전 μˆ˜κ°€ 더 큰 경우
				if(que.getLast()[1] > now) {
					result[i] = que.getLast()[0] + 1;
					que.add(new int[]{i, now});
				}
				// 이전 μˆ˜κ°€ 더 μž‘μ€ 경우
				else {
					while(que.size() > 0) {
						if(que.getLast()[1] < now) que.removeLast(); // 더 큰 수 λ§Œλ‚  λ•ŒκΉŒμ§€ λ’€μ—μ„œλΆ€ν„° κ°’ μ‚­μ œ
						else {
							result[i] = que.getLast()[0] + 1; // 더 큰 수 λ§Œλ‚¬μ„ λ•Œ
							break;
						}
					}
					que.add(new int[]{i, now});
				}
			}
		}
		
		for(int i = 0; i < n; i++) {
			out.append(result[i]);
			if(i < n-1) out.append(" ");
		}
		
		System.out.println(out);

	}

}

.πŸ‘‰ μŠ€νƒ 문제 !

  • 첫 번째 νƒ‘μ΄κ±°λ‚˜, 덱이 λΉ„μ–΄μžˆμ„ 경우 비ꡐ 없이 λ°”λ‘œ 덱에 값을 μΆ”κ°€ν–ˆλ‹€.
  • 덱이 λΉ„μ–΄μžˆμ§€ μ•Šμ„ κ²½μš°μ—λŠ” 덱의 λ§ˆμ§€λ§‰ μˆ˜μ™€ ν˜„μž¬ μž…λ ₯된 탑을 λΉ„κ΅ν–ˆλ‹€.
  • 덱의 κ°€μž₯ λ§ˆμ§€λ§‰ 탑보닀 ν˜„μž¬ 탑이 더 클 경우
    덱의 λ§ˆμ§€λ§‰ 탑은 아무 μ˜λ―Έκ°€ μ—†μ–΄μ§€λ―€λ‘œ λ°”λ‘œ λ±μ—μ„œ removeLast ν•΄μ£Όμ—ˆλ‹€.
    이와 같은 탐색을 λ°˜λ³΅ν•˜λ‹€κ°€ ν˜„μž¬ 탑보닀 더 큰 탑을 λ§Œλ‚˜λ©΄ ν•΄λ‹Ή νƒ‘μ˜ μœ„μΉ˜λ₯Ό 받아와 result에 기둝,
    ν˜„μž¬ 탑 λ˜ν•œ λ‹€λ₯Έ νƒ‘μ˜ λ ˆμ΄μ €λ₯Ό 받을 κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ 덱의 λ§ˆμ§€λ§‰μ— addν–ˆλ‹€.
    덱이 빌 λ•ŒκΉŒμ§€ 더 큰 탑을 λ§Œλ‚˜μ§€ λͺ»ν•  κ²½μš°μ—λŠ” ν˜„μž¬ 탑은 λ ˆμ΄μ €λ₯Ό 쏠 수 μžˆλŠ” 탑이 μ—†λ‹€κ³  νŒλ‹¨,
    λͺ¨λ‘ λΉ„μ–΄μžˆκ²Œ 된 덱에 ν˜„μž¬ νƒ‘μ˜ 정보λ₯Ό addν–ˆλ‹€.
  • 덱의 κ°€μž₯ λ§ˆμ§€λ§‰ 탑이 ν˜„μž¬ 탑보닀 더 클 경우
    λ°”λ‘œ λ ˆμ΄μ €λ₯Ό 쏠 수 μžˆλŠ” 탑을 찾은 κ²ƒμœΌλ‘œ νŒλ‹¨, κ°€μž₯ λ§ˆμ§€λ§‰ νƒ‘μ˜ 정보λ₯Ό result에 κΈ°λ‘ν•˜κ³ 
    ν˜„μž¬ 탑에 λŒ€ν•œ μ •λ³΄λŠ” 덱의 λ§ˆμ§€λ§‰μ— addν•΄μ£Όμ—ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ²˜μŒμ—” StringBuilder둜 좜λ ₯ν•˜μ§€ μ•Šμ•˜λ”λ‹ˆ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν–ˆλŠ”λ°, 좜λ ₯만 λ°”κΏ”μ£Όλ‹ˆκΉŒ λ°”λ‘œ 톡과 !
  • μ•žμœΌλ‘œλ„ 계속 StringBuilder κΌ­ μ‚¬μš©ν•΄μ•Όκ² λ‹€. (μ‹œκ°„ 2배이상 μ°¨μ΄λ‚¬μŒ)

λŒ“κΈ€