알고리즘/백준

백준 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로 짜는 편이 훨씬 가독성이 좋아서 첨부한다

공부해서 안 쓰는 건 없는 듯하다

 

 

 

 


크게 어렵지 않아 백지복습은 생략

반응형