HyeGyeong
HyeGyeong 프로그래머를 꿈꾸며 JavaScript 공부 중

[Algorithm] 프린터

[Algorithm] 프린터

문제설명

  • 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.

문제: https://programmers.co.kr/learn/courses/30/lessons/42587

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function solution(priorities: number[], location: number): number {
  let answer: number = 0;
  let tasks: any[] = priorities.map((val, i) => ({
    lo: i === location, // val의 인덱스가 location과 같은지 boolean값으로 체크
    val // val에 중요도 할당
  }));
  // [{lo: true || false, val: 중요도}, ...]
  while (true) {
    let curr: any = tasks.splice(0, 1)[0]; // tasks 배열의 첫번째 요소 -> {lo: index, val: 중요도}
    if (tasks.some(task => task.val > curr.val)) {
      // task의 val(중요도)가 curr.val보다 높은 게 있으면
      tasks.push(curr); // tasks 배열의 맨 뒤로 curr를 넣는다.
    } else {
      answer++; // curr이 가장 중요도가 높은 일이면 answer++ (인쇄 순서에 0번째는 없으니까...)
      if (curr.lo) {
        // curr.lo가 true면 answer return.
        return answer;
      }
    }
  }
}

const priorities = [2, 1, 3, 2]; // 높은 수 일수록 중요도 높음.
const location = 2; // index 2에 해당하는 문서가 몇 번째로 출력되는지 확인
const result = solution(priorities, location);
console.log(result); // priorities[2]는 '3'으로 가장 중요도 높음. 1번째로 출력