알고리즘/백준(BAEKJOON)

[백준]10828 스택 /자바/JAVA

jojelly 2021. 11. 3. 18:03
반응형

 

스택은 기본 원칙이 '후입선출(LIFO : Last in First out)' 이다. 

말 그대로 '나중에 들어온 것이 먼저 들어오는 방식'이다.

 

 

  • 먼저 들어온 것은 가장 아래에 있고, 가장 아래에 있는만큼 가장 나중에 빠져나오게 된다.
  • 그리고 데이터를 추가하는 작업을 push 라고 한다.
  • 또한 데이터를 삭제하는 작업을 pop 이라고 한다. 
  •  

 

 

이를 토대로 메서드를 구현하였다.

 

1
2
3
4
5
public class Stack10828 {
    private static int[] arr;     //스택을 담는 배열
    private static int str=0;    //스택포인터
 
}
cs

 

str은 스택 포인터로 스택에 쌓여있는 데이터의 수를 나타낼 것이다. 시작값 = 0

배열 arr은 배열을 저장하는 스택 본체의 배열이다. 

 

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
 
    public static void push(int x){ //push 메서드
        arr[str++]= x;
    }
 
    public static int pop(){
        if (str<=0){
            return -1;
        }
        return arr[--str];
    }
 
    public static int size(){
        return str;
    }
    public static int empty() {
        if(str == 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
 
    public static int top(){
        if (str<=0){
            return -1;
        }
        return arr[str-1];
    }
cs

 

push: 전달받은 테이더값x를 배열 arr에 저장해준다 위치는 str로 정하며 저장후에는 다음 위치로 str을 옮겨줘야하기 떄문에 arr[str++]을 이용하였다.

 

pop: 데이터를 제거한 후 제거한 수를 반환해줘야한다. 만약 저장되어있는 수가 없다면 -1을 반환해준다. 또한 str의 위치를 하나 전으로 가야하기 때문에 arr[--str]을 이용해준다. 

 

size: 택에 들어있는 정수의 개수를 출력한다. str을 반환해주면 되겠다.

 

empty: 스택이 비워져있는지 확인하는 메서드다. str이 0이면 1 이외에는 0을 반환하도록 작성했다.

 

top: 스택에 맨 위에 있는 요소를 반환하는 메서드. 현재 str은 빈공간의 배열을 가르키고 있기때문에 arr[str-1]로 확인해준다. pop과 달리이후의 값이 달라지지 않기 떄문에 str의 위치는 그대로 둔다.

 


1 . Scanner + StringBuilder를 사용하여 문제를 풀었다.

StringBuilder는 초보개발자인 나는 처음 이용해봤다. 다음 글을 StringBuilder에 대하여 정리해야겠다.

(StringBuilder는 문자열을 더할 떄 새로운 객체를 생성해서 더하는게 아니라 기존의 데이터에 더하는 방식이기 때문에 그냥 String 객체끼리 더할때에 비해 성능이 좋다.)

append()는 문자열을 더하는 역할을 한다. 

 

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
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
 
        int N = sc.nextInt();
        arr = new int[N];
 
        for (int i = 0; i<N; i++){
 
            String m = sc.next();
 
            switch (m){
                case "push" :
                    push(sc.nextInt());
                    break;
 
                case "pop" : //StringBuilder에는 append()가 있으며, 이는 문자열을 더하는 역할을 한다.
                    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);
        sc.close();
    }
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
 
import java.util.Scanner;
 
public class Main{
    private static int[] arr;
    private static int str=0;
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
 
        int N = sc.nextInt();
        arr = new int[N];
 
        for (int i = 0; i<N; i++){
 
            String m = sc.next();
 
            switch (m){
                case "push" :
                    push(sc.nextInt());
                    break;
 
                case "pop" : //StringBuilder에는 append()가 있으며, 이는 문자열을 더하는 역할을 한다.
                    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);
        sc.close();
    }
 
    public static void push(int x){ //push 메서드
        arr[str++]= x;
    }
 
    public static int pop(){
        if (str<=0){
            return -1;
        }
        return arr[--str];
    }
 
    public static int size(){
        return str;
    }
    public static int empty() {
        if(str == 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
 
    public static int top(){
        if (str<=0){
            return -1;
        }
        return arr[str-1];
    }
}
 
cs
반응형