👀 문제
https://www.acmicpc.net/problem/1874
👊 도전
1. 설계
- 배열에 입력값들을 저장한다.
- 스택에는 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. 설명
- 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문만 빠져져나와 마지막 줄의 출력문을 실행하기 때문이다.
- StringBuilder를 이용한다
- System.out.println()만을 사용하면 예제2와 같이 수열을 만들 수 없음을 알기 전까지 계속 +, -를 출력하므로 NO만 출력할 수 없게 된다.
- 따라서 sb를 이용하여 출력할 문자열들을 저장해두었다가, NO가 아닌 경우에 전체 출력문을 뽑아낸다.