1874번: 스택 수열
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]을 얻을 수 있다.
www.acmicpc.net

처음 봤을땐 무슨 소리인지 몰라서 구글링으로 문제를 이해했다.
정리해보자면 스택에 숫자는 오름차순(1,2,3,4,,,)으로 들어간다.
스택에 넣어주고 빼는 과정에서
입력할때 받은 숫자들의 순서대로 나올 수 있다면 "+", "-"로 표현하고
그렇지 않다면 "NO" 출력한다.
이때 스택에 넣어주는 것은 "+"
빼주는 것은 "-"로 표현한다.
예를들어
8
4
3
6
8
7
5
2
1
이렇게 입력받았다면
처음 8은 앞으로 8개의 숫자가 입력됨을 의미.
4가 나왔으므로
스택에 순서대로 1,2,3,4를 넣는다.
그리고 (stack.peek() == 입력받은 값) 비교를 통해
pop()여부 결정.
다음입력은 3이다.
이전에 받았던 값보다 작은 값이므로
이미 스택에 들어가 있을 것이다.
그러므로 스택에 숫자를 넣는 과정은 생략.
(stack.peek() == 입력받은 값 3)비교를 통해
pop()여부 결정.
스택에 1,2,3,4 까지 넣었었다.
다음에 넣을땐 5부터 넣으면 되는데
이를 코드로 포현해서
위 과정들을 끝까지 반복하면 된다.
결과로 나온 "+"와"-"를 한 번에 출력해야하므로 StringBuilder를 이용했다.
|
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
|
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc= new Scanner(System.in);
StringBuilder sb = new StringBuilder();
Stack<Integer> stk = new Stack<>();
int N = sc.nextInt();
int start = 0;
while(N-- > 0){
int value = sc.nextInt();
if(value > start) {
for (int i = start + 1; i <= value; i++) {
stk.push(i);
sb.append("+\n");
}
start = value;
}
if(stk.peek() != value){
System.out.println("NO");
return;
}else{
stk.pop();
sb.append("-\n");
}
}
System.out.println(sb);
}
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 10845 큐 자바[java] (0) | 2023.01.01 |
|---|---|
| 백준 1406 에디터 자바[java] (0) | 2023.01.01 |
| 백준 9012번 괄호 자바[java] (0) | 2022.12.31 |
| 백준 9093번 단어 뒤집기 자바[java] (0) | 2022.12.31 |
| 백준 10828번 스택 자바[java] (2) | 2022.12.30 |