본문 바로가기
Etc/Algorithm

[Java] 백준 10828번: 스택

by 달의 조각 2022. 7. 11.

 

 

첫 번째 시도

 

런타임 에러(ArrayIndexOutOfBounds)

❓ next()와 nextLine() 차이

💡

next() : 공백 이전까지 입력받은 문자열을 반환
nextLine() : Enter 이전까지 입력받은 문자열을 반환

때문에 next()를 사용하면 공백 이전까지 입력을 받으므로 'push X'를 입력했을 때 push까지 입력을 받았다

 

 

두 번째 시도

 

시간 초과

 Scanner와 BufferedReader의 특성

💡

이 문제는 시간 제한이 0.5초이다

InputStreamReader : 문자열을 한 글자 단위로 읽기 때문에 긴 문자열을 읽는 데에 비효율적이다
BufferedReader: InputStreamReader + 버퍼링 기능을 추가 / 라인 단위로 입력을 받음 / 공백 인식
일정한 크기의 데이터를 한 번에 읽어서 버퍼에 보관한 후, 사용자 요청 시 읽어 온다
Scanner: 공란과 줄바꿈을 입력 값의 경계로 인식

BufferedReader의 버퍼 사이즈가 훨 크기 때문에 속도가 훨 빠르다

import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        Stack st = new Stack();

        for (int i = 0; i < n + 1; i++) {
            String s = sc.nextLine();

            if (s.contains("push")) {
                String[] push = s.split(" ");
                st.push(Integer.parseInt(push[1]));
            }

            else if (s.equals("pop")) {
                if (st.isEmpty()) {
                    System.out.println("-1");
                } else {
                    System.out.println(st.pop());
                }
            }

            else if (s.equals("size")) {
                System.out.println(st.size());
            }

            else if (s.equals("empty")) {
                if (st.isEmpty()) {
                    System.out.println("1");
                } else {
                    System.out.println("0");
                }
            }

            else if (s.equals("top")) {
                if (!st.isEmpty()) {
                    System.out.println(st.peek());
                } else {
                    System.out.println("-1");
                }
            }

        }

    }
}

 

 

세 번째 시도

 

런타임 에러(NullPointer)

for문의 범위 설정

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        Stack st = new Stack();

        for (int i = 0; i < n + 1; i++) {
            String s = br.readLine();

            if (s.contains("push")) {
                String[] push = s.split(" ");
                st.push(Integer.parseInt(push[1]));
            }

            else if (s.equals("pop")) {
                if (st.isEmpty()) {
                    System.out.println("-1");
                } else {
                    System.out.println(st.pop());
                }
            }

            else if (s.equals("size")) {
                System.out.println(st.size());
            }

            else if (s.equals("empty")) {
                if (st.isEmpty()) {
                    System.out.println("1");
                } else {
                    System.out.println("0");
                }
            }

            else if (s.equals("top")) {
                if (!st.isEmpty()) {
                    System.out.println(st.peek());
                } else {
                    System.out.println("-1");
                }
            }

        }

    }
}

 

 

네 번째 시도

 

성공!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        Stack st = new Stack();

        for (int i = 0; i < n; i++) {
            String s = br.readLine();

            if (s.contains("push")) {
                String[] push = s.split(" ");
                st.push(Integer.parseInt(push[1]));
            }

            else if (s.equals("pop")) {
                if (st.isEmpty()) {
                    System.out.println("-1");
                } else {
                    System.out.println(st.pop());
                }
            }

            else if (s.equals("size")) {
                System.out.println(st.size());
            }

            else if (s.equals("empty")) {
                if (st.isEmpty()) {
                    System.out.println("1");
                } else {
                    System.out.println("0");
                }
            }

            else if (s.equals("top")) {
                if (!st.isEmpty()) {
                    System.out.println(st.peek());
                } else {
                    System.out.println("-1");
                }
            }

        }

    }
}

댓글