더 많이 실패하기

백준 10828번 스택 자바 Java (☆공부 225일차) 본문

알고리즘/백지 복습 기록

백준 10828번 스택 자바 Java (☆공부 225일차)

김발자~ 2023. 3. 12. 17:17
반응형

10828 스택

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

 

 

 


백준 10828번 문제 스택


문제


 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
0.5 초 (추가 시간 없음) 256 MB 199982 70382 51389 37.286%

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 1

2
2
0
2
1
-1
0
1
-1
0
3

예제 입력 2

7
pop
top
push 123
top
pop
top
pop

예제 출력 2

-1
-1
123
123
-1
-1

 

 

 


과정 생각해보기


 

https://gimbalja.tistory.com/149

 

백준 10828번 스택 자바 Java

10828 스택 https://www.acmicpc.net/problem/10828 10828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거

gimbalja.tistory.com

 

10월에 풀었던 문제

 

이미 stack 함수가 있지만, 직접 메서드로 구현해보는 문제이다

 

 

1. 입력 가능한 수를 크기로 갖는 static 배열 변수 stack과 크기를 기록할 static 숫자 변수 size를 선언한다
1
2
static int[] stack = new int[10_001];
static int size;
cs

 

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
static void push(int n) {
    stack[size] = n;
    size++;
}
 
static int pop() {
    if(size == 0) {
        return -1;
    }else{
        int val = stack[size-1];
//            stack[size-1] = 0;    ★ 있어도 되긴 하지만 의미 없음
        size--;
        return val;
    }
}
 
static int empty() {
    if(size == 0) {
        return 1;
    }else{
        return 0;
    }
}
 
static int top() {
    if(size == 0) {
        return -1;
    }else{
        return stack[size-1];
    }
}
cs

 

pop과 top에서 size-1인 게 주의할 점이겠다
주석으로 표시한 부분은 배열에서 size에 관련한 부분만 사용하고 있으므로 굳이 0으로 초기화하지 않아도 접근하지 않기 때문에 의미가 없다고 표시했다
size 메서드는 그냥 static 변수 size를 출력하면 되므로 만들지 않아도 된다

 

3. 입력되는 n만큼 반복문을 돌리고, 해당되는 명령마다 나눈다(push는 뒤에 숫자가 온다는 걸 명시)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int n = Integer.parseInt(br.readLine());
 
for(int i = 0; i < n; i++) {
    st = new StringTokenizer(br.readLine());
    switch(st.nextToken()) {
        case "push":
            push(Integer.parseInt(st.nextToken()));
            break;
        case "pop":
            bw.write(pop()+"\n");
            break;
        case "size":
            bw.write(size+"\n");
            break;
        case "empty":
            bw.write(empty()+"\n");
            break;
        case "top":
            bw.write(top()+"\n");
            break;
    }
}
cs

 

아래 정답 코드를 보면 이해하기 쉬울 것이다

 

 

 


정답 인정 코드


 

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
77
78
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class Main {
    
    static int[] stack = new int[10_001];
    static int size;    // ★
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        
        for(int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            switch(st.nextToken()) {
                case "push":
                    push(Integer.parseInt(st.nextToken()));
                    break;
                case "pop":
                    bw.write(pop()+"\n");
                    break;
                case "size":
                    bw.write(size+"\n");
                    break;
                case "empty":
                    bw.write(empty()+"\n");
                    break;
                case "top":
                    bw.write(top()+"\n");
                    break;
            }
        }
        bw.flush();
        bw.close();
        br.close();
 
    }
    
    static void push(int n) {
        stack[size] = n;
        size++;
    }
    
    static int pop() {
        if(size == 0) {
            return -1;
        }else{
            int val = stack[size-1];
    //            stack[size-1] = 0;    ★ 있어도 되긴 하지만 의미 없음
            size--;
            return val;
        }
    }
    
    static int empty() {
        if(size == 0) {
            return 1;
        }else{
            return 0;
        }
    }
    
    static int top() {
        if(size == 0) {
            return -1;
        }else{
            return stack[size-1];
        }
    }
}
 
cs

 

 

 


알고리즘 기초 부분부터 다시 복습 시작..

4달 전엔 BufferedWriter가 아니라 StringBuilder로 풀었었다

 

반응형

'알고리즘 > 백지 복습 기록' 카테고리의 다른 글

풀었던 문제 다시 풀기  (0) 2022.09.27
Comments