알고리즘 문제풀이/백준

#1873 : 스택 수열

모항 2022. 4. 12. 22:35

풀이방법

사용된 것:

Stack

 

2022.04.12

스택이 무엇인지 알면 풀 수 있는 쉬운 문제이다.

 

"NO"를 출력해야 하는 경우를 잡아내는 법을 생각해내기가 조금 어려울 수 있는데, 해결법은 다음과 같다.

이번에 수열에 추가되어야 하는 숫자가 스택에 들어있지만 top에 있지는 않은 경우, 바로 모든 것을 관두고 "NO"를 출력하면 된다.

같은 숫자를 두 번 add할 수는 없으므로, 스택의 깊은 곳에 들어가 있는 그놈을 무조건 꺼내야 수열에 추가할 수 있다.

그런데 그 숫자를 꺼내어 수열에 추가하려면 그 숫자보다 더 top에 가까운 수들을 먼저 pop해야만 한다.

pop되는 수는 무조건 수열에 추가되어버린다. 즉, 엉뚱한 수가 수열에 추가되게 된다.

그러므로 이번에 pop해야 하는 수가 스택의 top이 아닌 더 깊은 곳에 있다면 무조건 망한 것이다.

따라서

if(stack.contains(arr[cnt]) && stack.peek() != arr[cnt]) {
	System.out.print("NO");
	System.exit(0);
}

이러한 조건문을 이용하면 "NO"를 출력해야 하는 경우를 잡아낼 수 있다.

 

코드

Java(2022.04.12)

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

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		int[] arr = new int[n];
		for(int i = 0; i<n; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		Stack<Integer> stack = new Stack<Integer>();
		
		int cnt = 0;	//수열이 얼마나 완성되었는지를 세는 인덱스
		int num = 0;	//이번에 스택에 add되는 정수를 가리키는 변수
		StringBuilder sb = new StringBuilder();
		while(cnt<n) {
			
			if(stack.contains(arr[cnt]) && stack.peek() != arr[cnt]) {
				System.out.print("NO");
				System.exit(0);
			}
			
			if(stack.isEmpty()
					||
					stack.peek()<arr[cnt]) {
				num++;
				stack.add(num);
				sb.append("+" + System.lineSeparator());				
			}
			
			
			if(stack.peek() == arr[cnt]) {
				stack.pop();
				sb.append("-" + System.lineSeparator());
				cnt++;
			}
		}
		
		System.out.print(sb);

	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#10989 : 수 정렬하기 3  (0) 2022.04.13
#10828 : 스택  (0) 2022.04.12
#10814 : 나이순 정렬  (0) 2022.04.11
#1920 : 수 찾기  (0) 2022.04.10
#10250 : ACM 호텔  (0) 2022.04.06