mailgithub

백준 10845-큐

2024-04-14

문제

문제 링크

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

풀이

function solution(commands) {
  const queue = [];
  const answers = [];

  const command = {
    push: (value) => {
      queue.push(value);
    },
    pop: () => {
      if (queue.length === 0) {
        answers.push(-1);
      } else {
        answers.push(queue.shift());
      }
    },
    size: () => {
      answers.push(queue.length);
    },
    empty: () => {
      answers.push(queue.length === 0 ? 1 : 0);
    },
    front: () => {
      answers.push(queue.length === 0 ? -1 : queue[0]);
    },
    back: () => {
      answers.push(queue.length === 0 ? -1 : queue.at(-1));
    },
  };

  commands.forEach((commandInfo) => {
    const [currentCommand, value] = commandInfo.split(" ");

    if (currentCommand === "push") {
      command.push(value);
    } else {
      command[currentCommand]();
    }
  });

  return answers.join("\n");
}

설명

문제 유형은 큐입니다. 기본적으로 제공되는 배열의 Method 를 활용하면 쉽게 문제를 풀 수 있을 것 같아 배열을 활용했습니다. 코드는 크게 두 개를 생각했습니다. 각각의 command 를 정의하는 코드, 실행해야할 command 를 순회하면서 실행하는 코드입니다.

  1. command 실행 후 결과 값을 담을 queue 와 command 실행 후 출력 값을 담을 answer 을 선언합니다.
  2. 주어진 조건에 따라 command 를 선언합니다. queue 의 pop 은 첫 요소를 제거해야하므로 array.shift 를 사용했습니다.
  3. 실행해야할 command 를 forEach 를 통해 순회합니다. 이 때 push command 만 실행 시 값을 전달해야한다는 점을 반영하여 조건문을 작성했습니다.
  4. 예제 출력에 맞도록 join("\n") 을 사용했습니다.