스택수열(1874)
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
41
42
43
44
45
46
47
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
int index = 1;
for(int i = 1; i <= n; i++){
int num = Integer.parseInt(br.readLine());
while(true){
if(stack.isEmpty() || stack.peek() != num){
if(index <= n){
stack.push(index);
index++;
sb.append("+\n");
} else {
break;
}
} else {
stack.pop();
sb.append("-\n");
break;
}
}
}
if(!stack.isEmpty()){
sb.setLength(0);
sb.append("NO");
}
bw.write(sb + "");
bw.flush();
bw.close();
br.close();
}
}
풀이과정
1) stack이 push되는 경우와 pop이 되는 경우를 구분
2) 예제1 적용하여 올바른 값 출력
3) 예제2에 대한 코드를 추가
- 여기서 처음에는 while문 안에서 index가 n보다 크면 sb를 비우고, sb에 NO를 추가하고, break를 걸게 하였다.
- 그랬더니 예제1의 경우에도 NO가 출력되어 데이터를 하나씩 따라가다보니 예제 1의 경우에도 마지막 push가 일어난 후 index++가 되므로 index가 n보다 크게됨
- 그래서 sb를 비우고 NO를 넣는 과정을 for문 밖으로 수정
- NO가되는 경우에 while에서 무한루프 발생
- 어떻게 하면 나가게 될까 하다가 index가 n을 넘은 경우 stack에 push가 되지 않고 pop의 경우만 따지면 되기에 push되는 로직에 if절 추가
- while에 들어와서 else로 빠지지 않고 if로 들어온다하더라도 index가 n을 넘은 시점에서는 아무것도 하지않고 break 되어 for문의 횟수 하나씩 소비
- for문의 반복이 끝나면 stack의 비어있는 유무를 따져 NO로 수정
4) 성공!!
- 성공
- 메모리 : 27236 KB
- 시간 : 368 ms