미소를뿌리는감자의 코딩

[백준 2024/01/17] 10828번 스택 본문

코딩 테스트/백준

[백준 2024/01/17] 10828번 스택

미뿌감 2024. 1. 17. 18:49
728x90

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

 

10828번: 스택

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

www.acmicpc.net

 

1. 접근 방법

문제를 보자마자 stack 이 java에 구현되어 있는지 알아봐야겠다는 생각이 들었다.

Chat GPT -> 에게 stack의 구현 여부를 물어보았고, 구현이 되어 있다는 것을 알게 되었다.

 

따라서,

import java.util.Stack;

Stack<Integer> stack = new Stack<>();

을 통해 stack 선언을 해주었다.

 

다음으로, 코드를 구성에 유의한 점으로는

empty나, pop일 경우, stack.Empty() 여부를 확인해주는 과정이었다.

 

이렇게 코드를 구성해서, 처음 제출을 하였을 때, 시간 초과가 발생하였다.

시간 초과가 발생한 코드는 다음과 같다.

더보기

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

public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        Scanner scanner = new Scanner(System.in);
        String n = scanner.nextLine();
        int number = Integer.parseInt(n);

        for (int i=0; i<number;i++){
            String line = scanner.nextLine();
            String[] inp = line.split("\\s+");

            if(Objects.equals(inp[0], "push")){
                int new_inp =Integer.parseInt(inp[1]);
                stack.push(new_inp);
            }
            else if(Objects.equals(inp[0], "pop")){
                if(stack.isEmpty()){
                    System.out.println(-1);
                }
                else{
                    System.out.println(stack.pop());
                }
            }
            else if(Objects.equals(inp[0], "size")){
                System.out.println(stack.size());
            }
            else if(Objects.equals(inp[0], "empty")){
                if(stack.isEmpty()){
                    System.out.println(1);
                }
                else{
                    System.out.println(0);
                }
            }
            else{
                if(stack.isEmpty()){
                    System.out.println(-1);
                }
                else{
                    System.out.println(stack.peek());
                }
            }

        }

    }

}

이에 chat GPT에게 해당 코드를 속도적인 측면에서 개선할 수 있는 방법을 물어보았다.

 

입출력 최적화를 제안해 주었다.

Java의 경우 표준 입력 및 출력이 비교적 느려, 이를 최적화하기 위해 

BufferedReader, BufferedWriter, PrintWriter를 이용할 수 있다고 하였다.

이는 많은 양의 데이터를 처리할 때 효과적인 방법이다.

 

scanner 대신에 사용할 수 있었다.

switch 문으로 바꿀 것을 제안해 주었지만, Java 11로 백준에 입력하였을 때,

백준은 이를 제공하지 않기 때문에 switch 문을 사용할 수 없었다.

 

따라서, 입출력 최적화 부분을 적용해 주었다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//읽는 도구 선언
PrinterWriter pw = new PrintWriter(System.out);// print 도구 선언

int number = Integer.parseInt(br.readLine()); // line 읽어주기 + integer바꾸기

String line = br.readLine();
String[] inp = line.split("\\s+"); // line을 읽어주고, 공백 기준으로 나눠주기

pw.println() // print해줄 것을 여기에 넣어주기.

pw.flush() // 한번에 다 출력해주기
br.close() // 읽는 도구 닫아주기
pw.close() // 출력 도구 닫아주기

 

이런식으로 BufferedReader와 PrintWriter, BufferedWriter가 구성됨을 알 수 있었다.

 

삼항 연산자 조건문을 이용하여, 불필요한 if else문을 사용하지 않고도 짧게 만들 수 있었다.

ex)

(stack.isEmpty() ? 1 : 0);

 

2. 코드

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

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        Stack<Integer> stack = new Stack<>();

        int number = Integer.parseInt(br.readLine());

        for (int i=0; i<number;i++){
            String line = br.readLine();
            String[] inp = line.split("\\s+");

            if(Objects.equals(inp[0], "push")){
                stack.push(Integer.parseInt(inp[1]));
            }
            else if(Objects.equals(inp[0], "pop")){
                pw.println(stack.isEmpty()? -1: stack.pop());
            }
            else if(Objects.equals(inp[0], "size")){
                pw.println(stack.size());
            }
            else if(Objects.equals(inp[0], "empty")){
                pw.println(stack.isEmpty()? 1: 0);
            }
            else{
                pw.println(stack.isEmpty()? -1: stack.peek());
            }

        }
        pw.flush();
        br.close();
        pw.close();

    }

}
728x90

'코딩 테스트 > 백준' 카테고리의 다른 글

[백준 2024/01/17] 18258번 큐 2  (0) 2024.01.17
[백준 2024/01/17] 10773번 제로  (0) 2024.01.17
[백준 2024/01/17] 1002번 터렛  (0) 2024.01.17
[백준 2024/01/16] 1011번  (0) 2024.01.16
[백준 2024/01/16] 1110번  (0) 2024.01.16