프린터

YEONGHUN KO·2021년 12월 13일
0

ALGORITHMS - PRACTICE

목록 보기
38/50
post-thumbnail

1. 프린터

중요도가 높은 순서대로 먼저 프린트를 한다. 각각의 문서에 숫자가 매겨져 있는데, 숫자가 높을 수 록 중요도가 높아진다. 그래서 중요도가 가장 높은 문서가 가장 먼저 프린트 된다. 이때 location(idx)에 해당되는 문서가 몇번째로 출력되는지 리턴하면 된다. 만약, 자신보다 중요도가 더 높은 문서가 있으면 자신은 대기줄 맨 뒤에 배치된다.

예를 들어서 아래와 같이 중요도가 pass되었다고 해보자.

   중요도          location
[2, 1, 3, 2]          2

이때 location이 2에 해당되는, 즉 idx 2에 위치한 문서가 몇번째로 출력되는지 확인하면 된다. 가장 높으니깐 1이다. 만약 location이 0에 해당되는 문서는 어떻게 될까?

2 1 3 2
1 3 2 2
3 2 2 1 --> L:2 출력
2 2 1 -->  L:3 출력
2 1 --> L:0 출력
1
==> 3번째로 출력됨!

그럼 코드로 구현해보자!

2. 접근 방법

targetIdx를 잘 활용한다. targetIdx로 priorities가 바뀌더라도 L의 위치를 놓치지 않고 따라간다.

  • pseudo code
    • targetIdx를 location으로 설정
    • pri에서 맨처음 원소를 뽑아냄
    • while문을 돌림.
      • 자신보다 큰 원소가 있는지 알아봄(some 메소드를 써서)
        • 있으면 다시 push해서 맨 뒤로 옮김
        • 없으면 print를 하나올리고(프린트 하나 했다는 뜻) targetIdx === 0 일경우 break 함(여기서, 0이라는 뜻은 가장 중요도가 높으면서 location에 해당되는 문서라는 뜻이라서, 반복을 멈추고 바로 print를 리턴함)
      • targetIdx가 0이면 다시 뒤로 보냄
      • 그게 아니면 1씩 줄임.
      • 왜냐면 targetIdx는 뒤로 이동되어지다가 앞으로 점점 이동되어지니깐.
function print(pri, L) {
  let targetIdx = L;
  let print = 0;

  let first;

  while (pri.length) {
    first = pri.shift();
    if (pri.some((value) => value > first)) {
      pri.push(first);
    } else {
      answer++;
      if (targetIdx === 0) break;
    }

    if (targetIdx === 0) {
      taragetIdx = pri.length - 1;
    } else {
      targetIdx--;
    }
  }
  return print;
}

location의 변화과정을 그림으로 그리면서 잘 관찰하면 idx가 점점 감소한다는 것을 알 수 있다.

실제 큐를 통해서도 구현해보았다

function solution(priorities, location) {
  let answer = 0;
  let targetIdx = location;

  let pop;
  let queLength;

  const que = new Queue();

  priorities.forEach((val, idx) => {
    que.enqueue([val, idx]);
  });

  priorities.sort((a, b) => b - a);

  // queLength = que.size;

  // console.log(que);

  while (true) {
    const currentValue = que.peek();
    if (currentValue[0] < priorities[count]) {
      que.enqueue(que.dequeue());
    } else {
      const value = que.dequeue();
      answer++;
      if (location === value[1]) {
        return answer;
      }
    }
  }

  return answer;
}

class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.first = null;
    this.last = null;
    this.size = 0;
  }

  enqueue(val) {
    var newNode = new Node(val);
    if (!this.first) {
      this.first = newNode;
      this.last = newNode;
    } else {
      this.last.next = newNode;
      this.last = newNode;
    }
    return ++this.size;
  }

  dequeue() {
    if (!this.first) return null;
    var temp = this.first;
    if (this.first === this.last) {
      this.last = null;
    }
    this.first = this.first.next;
    this.size--;
    return temp.val;
  }

  peek() {
    return this.first.val;
  }
}

끝!

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글