본문 바로가기
PS

[백준] 스택, 큐 문제들 (10828, 1406, 1966, 1158)

by solanarey 2024. 9. 25.

자동목차

스택(10828)

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

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());
        StringBuilder sb = new StringBuilder();
        Stack<Integer> stack = new Stack<>();

        while (n-- > 0) {
            String[] command = br.readLine().split(" ");

            switch (command[0]) {
                case "push":
                    int val = Integer.parseInt(command[1]);
                    stack.push(val);
                    break;

                case "pop":
                    sb.append(stack.isEmpty() ? -1 : stack.pop()).append("\n");
                    break;

                case "size":
                    sb.append(stack.size()).append("\n");
                    break;

                case "empty":
                    sb.append(stack.isEmpty() ? 1 : 0).append("\n");
                    break;

                case "top":
                    sb.append(stack.isEmpty() ? -1 : stack.peek()).append("\n");
            }
        }
        System.out.println(sb);
    }


    static class Stack<T> {
        Node<T> top; // 스택 최상단
        int size; // 스택 사이즈

        static class Node<T> { // 스택의 각 요소
            T data;
            Node<T> next; // top의 바로 아래 요소를 가리킴

            public Node(T data) {
                this.data = data;
            }
        }

        void push(T data) {
            Node<T> node = new Node<>(data);
            node.next = top; // 새 요소의 next를 현재 top(꼭대기)가 가리키는 노드로 설정
            top = node; // 꼭대기를 새 노드로 갱신시킴
            size++;
        }

        T pop() {
            if (isEmpty()) throw new EmptyStackException();

            T data = top.data; // top에 있는 요소를 변수에 담아 반환
            top = top.next; // top 요소의 아래 요소를 top으로 갱신시킴
            size--;
            return data;
        }

        int size() {
            return size;
        }

        T peek() {
            if (isEmpty()) throw new EmptyStackException();
            return top.data;
        }

        boolean isEmpty() {
            return top == null;
        }


    }

}
메모리 시간
21076 168



에디터(1406)

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));
        String input = br.readLine();
        Stack<Character> left = new Stack<>();
        Stack<Character> right = new Stack<>();
        StringBuilder sb = new StringBuilder();

        /*
        * 커서 기준 왼쪽의 요소들은 left에 저장, 오른쪽 요소들은 right에 저장
        * abc
        * 9
        * L     ab / c
        * L     a / cb
        * L       / cba 
        * L       / cba
        * L       / cba
        * P x   x / cba
        * L       / cbax
        * B       / cbax
        * P y   y / cbax
        * */
        for (int i = 0; i < input.length(); i++)
            left.push(input.charAt(i)); // 제일처음 커서의 위치는 맨 뒤이므로 커서 기준 왼쪽 문자열들을 전부 left 스택에 저장

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

        while (n-- > 0) {
            String[] command = br.readLine().split(" ");

            switch (command[0]) {
                case "P":
                    char ch = command[1].charAt(0);
                    left.push(ch); // 커서 기준 왼쪽에 입력하는 명령어이므로 left에 저장함
                    break;

                case "L":
                    if (!left.isEmpty()) right.push(left.pop());
                    break;

                case "D":
                    if (!right.isEmpty()) left.push(right.pop());
                    break;

                case "B":
                    if (!left.isEmpty()) left.pop();
            }
        }

        for (char ch : left) sb.append(ch);
        while (!right.isEmpty()) sb.append(right.pop()); // 커서 오른쪽 요소들도 순서대로 출력하기위해 위에서부터 꺼냄
        System.out.println(sb);
    }
}
메모리 시간
150824 696
- 특이사항으로는 처음엔 동적배열을 이용하여 단순하게 문제의 요구사항대로만 풀었다가 시간 초과가 발생했음.  
   
   

프린트 큐(1966)

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

public class Main {
    public static void main(String[] args) throws IOException {
        //A B C D 각 문서의 중요도가 2 1 4 3 이라면
        //C D A B 순으로 출력
        //0번째부터 시작 중요도가 같다면 그냥 순서대로
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

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

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken()); // 문서의 개수
            int m = Integer.parseInt(st.nextToken()); // 몇번째로 출력되었는지 궁금한 문서

            st = new StringTokenizer(br.readLine(), " ");
            Queue<int[]> importance = new LinkedList<>();

            for (int j = 0; j < n; j++) {
                importance.add(new int[]{j, Integer.parseInt(st.nextToken())}); // [문서의 위치, 문서의 중요도]
            }

            int cnt = 0;
            boolean canPrint; // 현재 문서 출력 가능여부

            while (!importance.isEmpty()) {
                int[] current = importance.poll();
                canPrint = true;

                for (int[] q : importance) {
                    if (current[1] < q[1]) { // 큐의 처음요소와 그 다음요소의 중요도를 비교함
                        canPrint = false; // 중요도가 낮은 문서라면 출력할 수 없으니 false로 저장
                        break;
                    }
                }

                if (canPrint) { // 현재 문서가 뒤의 문서보다 중요도가 높은 문서라면 출력 가능하므로 카운트시킨다
                    cnt++;
                    if (current[0] == m) break; // 현재문서가 입력으로 받은 찾고자하는 문서라면 멈춘다
                } else {
                    importance.add(current); // 중요도가 낮은 것을 맨뒤에 추가
                }
            }
            System.out.println(cnt);
        }
    }
}
메모리 시간
14972 124
   
   

요세푸스 순열(1158)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

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

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        Queue<Integer> q = new LinkedList<>();

        for (int i = 1; i <= n; i++) q.add(i); // 1부터 n까지 큐에 추가

        StringBuilder sb = new StringBuilder();
        sb.append("<");

        while (!q.isEmpty()) {
            for (int i = 1; i < k; i++) { // k 이전까지의 숫자는 큐에서 빼내어 맨 뒤에 추가한다
                q.add(q.poll());
            }
            if (q.size() == 1) { // 큐의 요소가 마지막 한 개 남았을 때는 반점을 붙이면 안됨
                sb.append(q.poll());
            } else {
                sb.append(q.poll()).append(", "); // 현재 큐의 가장 앞에있는사람은 k번 사람임. k번째 사람을 큐에서 빼내고 출력하기위해 스트링빌더에 추가
            }
        }

        sb.append(">");
        System.out.println(sb);
    }
}
메모리 시간
294884 596

'PS' 카테고리의 다른 글

[백준] 그래프, 트리 (13116, 9934, 2210, 3187)  (1) 2024.09.27
[백준] 힙, 해시 테이블 (19638, 1927, 14235, 9375)  (0) 2024.09.26
[백준] 1920번 : 수 찾기  (0) 2023.10.26
구현 알고리즘 2  (0) 2023.10.08
구현 알고리즘 1  (1) 2023.10.08