알고리즘/백준
백준 10828번 스택 자바 Java
김발자~
2022. 10. 13. 19:07
반응형
10828 스택
https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
백준 10828번 문제 스택
문제
과정 생각해보기
https://gimbalja.tistory.com/138
자바의 정석에서 배운대로 stack을 그대로 활용해볼까 했지만
stack클래스의 메서드들을 그대로 이용하면 문제가 원하는 조건과 다르므로 다른 방법을 찾아야 할 것 같다
검색해보니 stack을 배열로 직접 구현하기도 하는 모양이다
오답
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] stack = new int[10001];
static int size;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
if(str.equals("push")) {
push(Integer.valueOf(st.nextToken()));
}
else if(str.equals("pop")) {
sb.append(pop()).append("\n");
}else if(str.equals("size")) {
sb.append(size()).append("\n");
}else if(str.equals("empty")) {
sb.append(empty()).append("\n");
}else if(str.equals("top")) {
sb.append(top()).append("\n");
}
}
System.out.println(sb);
}
static void push(int x) {
stack[size] = x;
size++;
}
static int pop() {
if(size == 0)
return -1;
else {
int Pop = stack[size-1];
size--;
return Pop;
}
}
static int size() {
return size;
}
static int empty() {
if(size == 0)
return 1;
else
return 0;
}
static int top() {
if(size == 0)
return -1;
else {
int Top = stack[size];
size--;
return Top;
}
}
}
|
cs |
잘했다고 생각했는데 push가 제대로 되지 않았다
정답 인정 코드
방법1. if 사용
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] stack = new int[10001];
static int size;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
if(str.equals("push")) {
int num = Integer.parseInt(st.nextToken());
push(num);
}
else if(str.equals("pop")) {
sb.append(pop()).append("\n");
}else if(str.equals("size")) {
sb.append(size()).append("\n");
}else if(str.equals("empty")) {
sb.append(empty()).append("\n");
}else if(str.equals("top")) {
sb.append(top()).append("\n");
}
}
System.out.println(sb);
}
static void push(int x) {
stack[size] = x;
size++;
}
static int pop() {
if(size == 0)
return -1;
else {
int Pop = stack[size-1];
size--;
return Pop;
}
}
static int size() {
return size;
}
static int empty() {
if(size == 0)
return 1;
else
return 0;
}
static int top() {
if(size == 0)
return -1;
else {
int Top = stack[size-1];
return Top;
}
}
}
|
cs |
push가 아니라 top이 잘못된 거였다!
top에서 stack[size-1]로 바꿔주고 size--;을 지워주면 정답처리된다
방법2. switch 사용
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] stack = new int[10001];
static int size;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
switch (str) {
case "push" :
push(Integer.parseInt(st.nextToken()));
break;
case "pop" :
sb.append(pop()).append("\n");
break;
case "size" :
sb.append(size()).append("\n");
break;
case "empty" :
sb.append(empty()).append("\n");
break;
case "top" :
sb.append(top()).append("\n");
break;
}
}
System.out.println(sb);
}
static void push(int x) {
stack[size] = x;
size++;
}
static int pop() {
if(size == 0)
return -1;
else {
int Pop = stack[size-1];
size--;
return Pop;
}
}
static int size() {
return size;
}
static int empty() {
if(size == 0)
return 1;
else
return 0;
}
static int top() {
if(size == 0)
return -1;
else {
int Top = stack[size-1];
return Top;
}
}
}
|
cs |
switch로 짜는 편이 훨씬 가독성이 좋아서 첨부한다
공부해서 안 쓰는 건 없는 듯하다
크게 어렵지 않아 백지복습은 생략
반응형