01-09 18:44
Recent Posts
Recent Comments
관리 메뉴

miinsun

[BAEKJOON] λ°±μ€€ μŠ€νƒ 1874 :: μŠ€νƒ μˆ˜μ—΄ λ³Έλ¬Έ

Algorithm/Baekjoon

[BAEKJOON] λ°±μ€€ μŠ€νƒ 1874 :: μŠ€νƒ μˆ˜μ—΄

miinsun 2022. 4. 18. 18:47

πŸ’¬  문제 μ„€λͺ…

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ 가지고 μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

πŸ”¨  μž…μΆœλ ₯ 예

μž…λ ₯ 

  • 첫 쀄에 n (1 ≤ n ≤ 100,000)이 주어진닀.
  • λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 주어진닀.
  • λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

 

좜λ ₯

  • μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€.
  • push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€.
  • λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1)

8
4
3
6
8
7
5
2
1

 

예제 좜λ ₯ 1)

+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-

 

예제 μž…λ ₯ 2)

5
1
2
5
3
4

 

예제 좜λ ₯ 2)

NO

​

πŸ‘Ύ Hint

1λΆ€ν„° nκΉŒμ§€μ— μˆ˜μ— λŒ€ν•΄ μ°¨λ‘€λ‘œ [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 μˆ˜ν–‰ν•˜λ©΄ μˆ˜μ—΄ [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 μžˆλ‹€.

 

πŸ’»  Main.java

/* λ°±μ€€ 자료ꡬ쑰 - 1874 :: μŠ€νƒ μˆ˜μ—΄ */
import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();

		StringBuilder sb = new StringBuilder();
		Stack<Integer> s = new Stack<>();
		
		int tmp = sc.nextInt();	// 첫 번째둜 ꡬ해야 ν•˜λŠ” 수 μž…λ ₯
		int limit = 1;	// λ§Œλ“€μ–΄μ•Όν•˜λŠ” μˆ˜μ—΄ 수 cnt
		for(int i = 1; i <= N; i++) {
			s.add(i);	// 1~NκΉŒμ§€ μˆ˜μ—΄ μΆ”κ°€
			sb.append('+').append('\n');
			
			while(!s.isEmpty() && s.peek() == tmp) {	// ꡬ해야 ν•˜λŠ” 수λ₯Ό λ§Œλ‚˜λ©΄
				s.pop();
				sb.append('-').append('\n');
				if(limit < N) {	// limitμ•ˆμ— λ“€λ•Œλ§Œ μƒˆλ‘œμš΄ μž…λ ₯λ°›κΈ°
					tmp = sc.nextInt();
					limit++;
				}
			}

		}
		
		if(limit == N)	// λͺ¨λ“  μž…λ ₯을 λ°›κ³  μˆ˜μ—΄μ„ μ™„μ„±ν•˜λ©΄ 성곡
			System.out.println(sb);
		else	// λͺ¨λ“  μž…λ ₯을 받지 λͺ»ν•˜κ³  μˆ˜μ—΄μ„ μ™„μ„±ν•˜λ©΄ μ‹€νŒ¨
			System.out.println("NO");
		sc.close();
	}
}
Comments