본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 1966/javascript] 프린터 큐

by tokkiC 2022. 9. 26.

큐를 돌리며 높은 순서대로 뽑아내고

같은 숫자가 여러개라도 처음에 특정한 요소를 제대로 세며 몇번째로 뽑는지 세는 문제

문제에서 원하는건 간단한데 구현이 조금 까다로웠다

같은 수여도 초기 선택 요소를 특정하기 위해서 큐를 돌릴 배열과 크기가 같되, 특정 인덱스만을 표시하여

현재 특정한 요소의 인덱스를 확인가능하여 같은 수가 여러개여도 혼동하지 않도록 하였다

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

let input = [];

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout,
});

readline.on("line", (line) => {
  input.push(line);
});

readline.on("close", () => {
  solution(input);
  process.exit();
});

const solution = (inp) => {
  let arr;
  let ans = [];
  let n;
  let m;
  for (let i = 1; i < inp.length; i++) {
    if (i % 2 === 1) {
      [n, m] = inp[i].split(" ").map((el) => Number(el));
    }
    if (i % 2 === 0) {
      arr = inp[i].split(" ");
      let q = [...arr];
      let chk = Array(q.length).fill(0);
      chk[m] = 1;
      let target = Number(arr[m]);
      let cnt = 0;

      // 배열에 수가 남아있지 않거나 조건으로 탈출하기 전까지 계속 수행해라
      while (q.length) {
        let maxi = Math.max(...q);
        let idx = q.indexOf(String(maxi));
        let chkidx = chk.indexOf(1);

        // 배열 중 최대값이 목표수가 아니라면 최대값이 맨 앞이 나올때까지 돌린다
        if (maxi !== target) {
          for (let i = 0; i < idx; i++) {
            q.push(q.shift());
            chk.push(chk.shift());
          }
          // 최대값이 목표값과 같다면
        } else {
          if (idx === chkidx) {
            cnt++;
            break; // 그 배열은 더 돌 필요 없다
            // 찾은 최대값들 중 목표 요소가 맨 앞이 아니라면
          } else {
            let samecnt = 0;
            for (let j = 0; j < chkidx; j++) {
              if (q[j] === arr[m]) {
                samecnt++;
              }
            }
            cnt += samecnt + 1;
            break;
          }
        }

        // 맨 앞의 수는 배열 중 최대값이다. 빼주고 인쇄 수를 늘려주자
        q.shift();
        chk.shift();
        cnt++;
      }
      ans.push(cnt);
    }
  }
  console.log(ans.join("\n"));
};

댓글