알고리즘 스터디 (스택[백준 10828])

박윤택·2022년 5월 27일
2

알고리즘

목록 보기
10/25

문제

문제 이해

문제에서 제시하는 명령어를 기반으로 스택을 구현한 다음 각각의 명령어를 입력했을때 출력 결과가 나와야한다.

  • N : 명령어 수
  • 명령어 + 숫자 또는 명령어 입력받기

코드

스택 라이브러리 사용

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

public class Main {
  static int N;
  static Stack<Integer> stack = new Stack<Integer>();

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

    N = Integer.parseInt(st.nextToken());

    for (int i = 0; i < N; i++) {
      st = new StringTokenizer(br.readLine());
      String op = st.nextToken();
      Integer value = -1;
      if (st.countTokens() == 1) {
        value = Integer.valueOf(st.nextToken());
      }
      print(op, value);
    }
  }

  public static void print(String op, Integer value) {
    switch (op) {
      case "push":
        stack.push(value);
        break;
      case "pop":
        if (stack.empty())
          System.out.println(-1);
        else
          System.out.println(stack.pop());
        break;
      case "top":
        if (stack.empty())
          System.out.println(-1);
        else
          System.out.println(stack.peek());
        break;
      case "size":
        System.out.println(stack.size());
        break;
      case "empty":
        if (stack.empty())
          System.out.println(1);
        else
          System.out.println(0);
        break;
      default:
        break;
    }
  }
}

스택 구현

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

public class Main {
  static int N;

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    Stack stack = new Stack();

    N = Integer.parseInt(st.nextToken());

    for (int i = 0; i < N; i++) {
      st = new StringTokenizer(br.readLine());
      String op;
      int value = 0;
      op = st.nextToken();
      if (st.countTokens() == 1) {
        value = Integer.parseInt(st.nextToken());
      }
      if (op.equals("push"))
        stack.push(value);
      else if (op.equals("pop"))
        stack.pop();
      else if (op.equals("size"))
        stack.size();
      else if (op.equals("empty"))
        stack.empty();
      else
        stack.top();
    }
  }

  public static class Stack {
    private ArrayList<Integer> stack;
    private int index;

    public Stack() {
      this.stack = new ArrayList<>();
      this.index = 0;
    }

    public void push(int value) {
      this.stack.add(value);
      this.index++;
    }

    public void pop() {
      if (this.stack.size() <= 0)
        System.out.println(-1);
      else {
        System.out.println(this.stack.get(this.index - 1));
        this.stack.remove(this.index - 1);
        this.index--;
      }
    }

    public void top() {
      if (this.stack.size() <= 0)
        System.out.println(-1);
      else
        System.out.println(this.stack.get(this.index - 1));
    }

    public void size() {
      System.out.println(this.stack.size());
    }

    public void empty() {
      if (this.index <= 0)
        System.out.println(1);
      else
        System.out.println(0);
    }
  }
}

코드 설명

  • 스택 라이브러리 사용
  1. 몇개의 명령어를 입력할 것인지 입력받아 N에 대입
  2. N 만큼 반복하면서 명령어를 입력받는다.
  3. 명령어 토큰 개수에 따라 분기처리한다.
  4. 명령어에 따라 출력하는 함수(print)를 작성한다.
  5. print() 함수내에서는 명령어에 따라 처리를 하기 위해 case문을 작성한다.
  6. 각각의 명령어에 따라 처리한다.
  • 스택 구현
  1. Stack 클래스를 정의하고 멤버 변수로 스택을 담을 ArrayList, 제일 위의 index를 확인할 변수를 선언한다.
  2. print() 함수내에서는 명령어에 따라 처리를 하기 위해 case문을 작성한다.
  3. 각각의 명령어에 맞는 로직을 처리
  4. 스택 객체 생성
  5. 몇개의 명령어를 입력할 것인지 입력받아 N에 대입
  6. N 만큼 반복하면서 명령어를 입력받는다.
  7. 명령어 토큰 개수에 따라 분기처리한다.
  8. 각각의 명령어에 따라 처리한다.


0개의 댓글