본문 바로가기

CS ﹒ Algorithm/Baekjoon

JAVA 백준 문제풀이(27) 10828:스택, 19258:큐2

 

오늘은 너무 쉬운 문제라서 차마 이걸로 1일 1백준을 했다고 하기엔 좀 그래서.. 두 문제 풀었다..

대신 둘 다 쉬운 걸로.. ㅎ..

 

저 위에 왜 실패 딱지가 붙어있냐고 묻는다면 나도 모른다.

거슬려서 6번 제출했는데도 실패라고 써있어서 포기했다.

 

stack 자료구조를 대충이라도 알고 있다면 누구나 쉽게 풀었을 문제일 것이다.

 

 

stack은 LIFO(Last In First Out) 구조로 되어 있어서 가장 마지막에 들어온 데이터를 가장 먼저 반환하고, 처음 들어온 데이터는 모든 데이터가 반환되고 나서야 반환할 수 있다.

 

우리가 사용하는 자바의 스택 메모리가 이런 Stack 자료구조로 되어있다.

또한 자바 내에서 애초에 stack을 사용할 수 있기 때문에 그냥 stack 사용 해서 해당 메서드들을 그대로 사용해서 풀어도 상관 없다..

일반 배열로 풀어도 상관 없고(배열 크기 문제로 손이 제일 많이 간다) ArrayList나 Vector로 풀어도 상관 없다.

 

나는 기본 배열으로 풀기는 귀찮고 stack으로 받아쓰기 하자니 심심해서 ArrayList로 풀었다. 문제에서 뭘 구현해야하는지 이미 다 제시하고 있어서 크게 설명할 부분이 없다.

 

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

public class Main {
    static ArrayList<Integer> stack = new ArrayList<Integer>();
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int i=0; i<T; i++) {
            String input = br.readLine();
            int lastIndex = stack.size()-1;

            if ( input.startsWith("push") ) {
                String[] inputArr = input.split(" ");
                int inputNum = Integer.parseInt(inputArr[1]);

                stack.add(inputNum);
            }

            else if ( input.equals("pop") ) {
                if (stack.isEmpty()) {
                    System.out.println(-1);
                } else {
                    System.out.println(stack.get(lastIndex));
                    stack.remove(lastIndex);
                }
            }

            else if ( input.equals("size") ) {
                System.out.println(stack.size());
            }

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

            else if ( input.equals("top") ) {
                if (stack.isEmpty()) {
                    System.out.println(-1);
                } else {
                    System.out.println(stack.get(lastIndex));
                }
            }
        }
    }
}

 

 

 

 

 

다음으로 큐다.

 

 

큐는 먼저 입력된 데이터가 먼저 반환되고, 나중에 들어온 데이터는 나중에 반환되는 큐다.

우선순위 큐나 디큐 같은 것들도 있으니 궁금하면 찾아보자.

 

이것도 스택이랑 별반 다를 것 없이 자바에 이미 Dequeue라는 이름으로 구현되어 있어서 그대로 사용해도 되고, 배열로 구현해도 되고, LinkedList로 구현해도 된다.

 

이것도 문제에서 원하는 바를 이미 모두 명시하고 있으니 딱히 설명할 게 없다.

다만 BufferedReader와 BufferedWriter 둘 다 사용하지 않으면 LinkedList로는 통과할 수 없다.

Dequeue도 별다른 특별한 기능이 있는 건 아니고 LinkedList랑 비슷해서 아마 마찬가지일 듯..? 직접 확인해보지는 않았다.

 

그리고 BufferedWriter 처음 써보는 사람들이 헷갈려하는 게 있는데 ( 나 포함 )

flush() 메서드는 마지막에 한 번만 사용해야 한다. 매번 쓰면 System.out.print보다 더 안 좋다.

 

 

 

 

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

public class Main {
    static LinkedList<Integer> queue = new LinkedList<>();
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(br.readLine());

        for ( int i=0; i<T; i++ ) {
            String userInput = br.readLine();
            String[] inputArr = userInput.split(" ");

            if (userInput.startsWith("push")) {
                int inputNum = Integer.parseInt(inputArr[1]);
                queue.addFirst(inputNum);
            }

            else if (userInput.equals("pop")) {
                if ( queue.peekLast() != null ) {
                    bw.write(String.valueOf(queue.pollLast()));
                    bw.newLine();
                } else {
                    bw.write(String.valueOf(-1));
                    bw.newLine();
                }
            }

            else if (userInput.equals("size")) {
                bw.write(String.valueOf(queue.size()));
                bw.newLine();
            }

            else if (userInput.equals("empty")) {
                if ( queue.isEmpty() ) {
                    bw.write(String.valueOf(1));
                    bw.newLine();
                } else {
                    bw.write(String.valueOf(0));
                    bw.newLine();
                }
            }

            else if (userInput.equals("front")) {
                if ( queue.peekLast() != null ) {
                    bw.write(String.valueOf(queue.peekLast()));
                    bw.newLine();
                } else {
                    bw.write(String.valueOf(-1));
                    bw.newLine();
                }
            }

            else if (userInput.equals("back")) {
                if ( queue.peekFirst() != null ) {
                    bw.write(String.valueOf(queue.peekFirst()));
                    bw.newLine();
                } else {
                    bw.write(String.valueOf(-1));
                    bw.newLine();
                }
            }
        }
        bw.flush();
    }
}