[JAVA/백준] 스택: 스택 수열

👀 문제

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

👊 도전

1. 설계

  1. 배열에 입력값들을 저장한다.
  2. 스택에는 1부터 n까지 차례대로 넣을 수 있고, array[i]를 만들기 위해서는 push와 pop을 몇 번 사용해야하는지 체크한다.

2. 구현 (성공 코드)

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
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
import java.util.Stack;

/**
 * @author HEESOO
 *
 */
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n=input.nextInt();
		int[] array=new int[n];
		for(int i=0;i<n;i++) 
			array[i]=input.nextInt();
		Stack<Integer> st=new Stack<>();
		StringBuilder sb=new StringBuilder();
		
		int num=1;
		for(int i=0;i<n;i++) {
			int now=array[i];
			while(num<=now) {
				sb.append("+\n");
				st.push(num);
				num++;
			}
			if(st.peek()!=now) {
				System.out.println("NO");
				return;
			}
			else{
				sb.append("-\n");
				st.pop();
			}
		}
		System.out.println(sb.toString());
	}
}

 

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. array[i]를 만들기 위해 스택에 push와 pop을 몇 번 사용해야하는지 계산한다.
    • num은 1~n까지의 값으로 스택에는 1부터 순서대로 넣을 수 있다.
    • 입력받은 값들은 array에 저장한다.
    • 현재 array[i]를 now라 한다.
    • 스택에서 now를 빼려면 num이 now까지 스택에 push되어 있어야한다. while문을 통해 num==now될 때까지 넣는다.
    • now를 출력할 수 있을 때는 스택의 top이 now인 경우이다. 맞다면 sb에 저장한다.
    • top이 now가 아니라면 수열을 만들 수 없다. now를 출력하기 위해서 아직 사용하지 않은 top을 pop해야 하기 때문이다. 따라서 NO를 출력한 후 다음 숫자들은 볼 필요도 없으므로 return으로 종료한다. break를 사용하지 않는 이유는, 해당 위치에서 break를 할 경우 for문만 빠져져나와 마지막 줄의 출력문을 실행하기 때문이다.
  2. StringBuilder를 이용한다
    • System.out.println()만을 사용하면 예제2와 같이 수열을 만들 수 없음을 알기 전까지 계속 +, -를 출력하므로 NO만 출력할 수 없게 된다.
    • 따라서 sb를 이용하여 출력할 문자열들을 저장해두었다가, NO가 아닌 경우에 전체 출력문을 뽑아낸다.

👏 해결 완료!