[백준][Java]스택 - 10828

·2025년 9월 21일
0

코딩테스트

목록 보기
5/16

[백준]스택 - 10828


✅나의 문제 풀이

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));
        StringBuilder out = new StringBuilder();

        //입력받을 문자열 갯수
        int n = Integer.parseInt(br.readLine());
        Stack<Integer> stack = new Stack<>();   //스택 정의

        for(int i=0;i<n; i++){
            String line = br.readLine();    //명령어 입력받음
            if(line.startsWith("push")){
                //명령어가 push로 시작하면 push 이후 뒷부분(6번째 글자부터)자르고, 그 값을 stack에 넣는다
                stack.push(Integer.parseInt(line.substring(5).trim()));
            }else if(line.equals("pop")){
                //stack.empty() : 스택이 비었으면 true, 아니면 false
                //스택이 비어있으면 -1 + 개행, 비어있지않으면 pop()으로 맨 위 원소 꺼내고
                //StringBuilder에 결과와 개행을 붙여서 버퍼링(나중에 한번에 출력)
                out.append(stack.empty()? -1 : stack.pop()).append('\n');
            }else if(line.equals("size")){
                out.append(stack.size()).append('\n');
            }else if(line.equals("empty")){
                out.append(stack.empty()? 1 : 0).append('\n');
            }else if(line.equals("top")){
                out.append(stack.empty()? -1 : stack.peek()).append('\n');
            }
        }
        System.out.println(out.toString());
    }
}

  • 먼저 스택을 정의해주고, 입력받을 문자열 개수만큼 for문을 돌린다.
  • for문안에 if문을 이용해서 명령어를 구분하고, 그에 맞게 명령어를 처리한다.
  • 특히 push는 push 5와 같이 push 이후에 정수로 스택에 넣을 값을 지정해주기 때문에, startsWith() 메서드를 이용하여 명령어가 push로 시작하는지 판별하고, push로 시작한다면 substring으로 push 이후의 글자를 자른다.

스택

  • push() : 스택에 데이터를 추가하는 메서드
  • pop() : 스택에 들어있는 데이터를 삭제하는 메서드
  • peek() : 데이터는 삭제하지 않고 스택 맨 위에 있는 값을 확인하는 메서드
  • size() : 현재 스택에 저장되어 있는 요소의 개수를 알려주는 메서드
  • empty() : 스택이 비어있는지, 데이터가 들어있는지 확인하는 메서드(true/false)

문자열 입력

  • 문자열 입력은 Scanner가 아니라 BufferedReader를 사용했다.
  • BufferdReader는 문자를 버퍼에 모아서 한꺼번에 읽는 자바의 입력 클래스이다.
  • 보통 BufferdReader로 문자열을 입력받고, StringBuilder로 출력을 모은다.

기본 구성

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in)); // 표준 입력

String line = br.readLine();	//한 줄 읽기

자주 쓰는 패턴

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder out = new StringBuilder();

int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
    String line = br.readLine();
    // 필요 시:
    // StringTokenizer st = new StringTokenizer(line);
    // String[] parts = line.split("\\s+");
    out.append(line).append('\n'); // 결과 모으기
}
System.out.print(out.toString());  // 한 번에 출력

Scanner vs BufferedReader

  • Scanner : 사용 간단하지만 속도가 느림.
  • BufferedReader : 라인 단위로 읽고 직접 파싱하며, Scanner보다 빠르다.
profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글