백준 28278 스택 2[JAVA]

Ga0·2023년 8월 3일
0

baekjoon

목록 보기
83/125

문제 해석

  • 첫번째 줄에 받을 명령의 수(N)을 입력받고, N개만큼 아래의 명령을 수행한다.

    1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
    2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
    3: 스택에 들어있는 정수의 개수를 출력한다.
    4: 스택이 비어있으면 1, 아니면 0을 출력한다.
    5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.

코드

1번 방식

import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {

    static LinkedList<Integer> stack = new LinkedList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        StringTokenizer st;

        int N = Integer.parseInt(br.readLine()); //명령어의 수

        while(N --> 0){
            st = new StringTokenizer(br.readLine());
            String command = st.nextToken();
            if(command.equals("1")){
                stack.addFirst(Integer.parseInt(st.nextToken()));
            }else if(command.equals("2")){
                sb.append(stack.isEmpty() ? -1 : stack.pollFirst()).append("\n");
            }else if(command.equals("3")){
                sb.append(stack.size()).append("\n");
            }else if(command.equals("4")){
                sb.append(stack.isEmpty() ? 1 : 0).append("\n");
            }else if(command.equals("5")){
                sb.append(stack.isEmpty()? -1 : stack.getFirst()).append("\n");
            }
        }
        br.close();

        System.out.println(sb);

    }

}
        
  • 있는 메소드를 사용했더니 시간이며 메모리를 너무 잡아먹었다... 그래서 시간을 줄이기 위해 다른 방법을 사용해봤다. (코드는 엄청 간단하므로 설명은 생략하겠다... 스택 문제에서 많이 마주쳤기도 했고 읽다보면 당연하게 읽힐 것이라 생각이 든다..ㅎ)

2번 방식

import java.io.*;
import java.util.Stack;

public class Main {

    static Stack<Integer> stack = new Stack<>();
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); //명령어의 수

        while(N --> 0){
            solution(br.readLine());
        }

        br.close();

        System.out.println(sb);
    }

    static void solution(String query){
        char c = query.charAt(0); //첫번째 문자는 명령어

        switch (c){
            //case 1의 경우 query.substring(2);를 한 이유는 공백도 문자로 포함하기 때문이다 1 X 형태이기 때문에 X의인덱스는 2다.
            case '1' : stack.push(Integer.parseInt(query.substring(2))); return;
            case '2' : sb.append(stack.isEmpty() ? -1 : stack.pop()).append("\n"); return;
            case '3' : sb.append(stack.size()).append("\n"); return;
            case '4' : sb.append(stack.isEmpty() ? 1 : 0).append("\n"); return;
            case '5' : sb.append(stack.isEmpty() ? -1 : stack.peek()).append("\n"); return;
            default: break;
        }
    }
}
        
        
  • pop(): 스택에서 가장 위에 있는 항목을 제거

  • push(element): element 하나를 스택의 가장 윗 부분에 추가

  • peek(): 스택의 가장 위에 있는 항목을 반환

  • isEmpty(): 스택이 비어 있을 때에 true를 반환

  • 위와 같이 코드를 짰더니 시간과 메모리를 덜 잡는 것을 알 수 있다.

결과

1번 결과

2번 결과

느낀 점

  • 어려움이 없던 문제였다. (이미 제공하는 메소드들이 있었기 때문에 가져다 쓴 것 밖에 없다...)

0개의 댓글