본문 바로가기
알고리즘

[프로그래머스/자바스크립트] 스택/큐_프린터

2021. 11. 10.

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

첫번째 풀이 (실패~~)

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

  var maxPriority = Math.max(...priorities);
  var maxLocation = priorities.indexOf(maxPriority);

  if (location == maxLocation) {
    answer = 1;
  } else if (location < maxLocation) {
    answer = priorities.length - maxLocation + location + 1;
  } else if (location > maxLocation) {
    answer = location - maxLocation + 1;
  }

  return answer;
}

 

- 왜이렇게 쉽게 풀릴까. 나는 정말 알고리즘 실력이 늘어버린 걸까. 자만하면서 제출했는데 결과 처참ㅋ

 

두번째 풀이 (다른 사람 풀이 보고)

function solution(priorities, location) {
  // {index: 0, priority: 2} 형식의 객체들로 만들어서 arr 라는 배열에 넣음.
  var arr = priorities.map((priority, index) => {
    return {
      index: index,
      priority: priority,
    };
  });

  var queue = [];

  while (arr.length > 0) {
    //가장 앞에 있는 문서를 꺼낸다. => firstEle
    var firstEle = arr.shift();
    // 남은 배열에서 firstEle의 중요도보다 큰 게 하나라도 있는지(some)
    // => hasHightPriority (false 면, firstEle가 최고 중요도라는 의미)
    var hasHighPriority = arr.some((ele) => ele.priority > firstEle.priority);

    //true 이면, arr 의 맨 뒤로 보냄.
    if (hasHighPriority) {
      arr.push(firstEle);
      // false 이면 queue 에 넣음.
    } else {
      queue.push(firstEle);
    }
  }

 return queue.findIndex((queueEle) => queueEle.index === location) + 1;
}

 - arr를 한번 다 돌고나서 나온 queue에는 최고 중요도인 것들만 있음. 여러개 있을 수 있음을 고려해야함! (최고 중요도가 9라고 할 때, 중요도9인 원소가 여러개일 수 있음) 나는 이 부분을 고려하지 못했다. (너무 단순하게 생각했음..ㅜ)

- 그러므로 queue 에서 내가 관심있는 특정 문서(location)와 index가 일치하는 원소의 인덱스를 찾는다.
여기서 element.index는 처음 입력받았을 때의 index이고, findIndex로 찾는 index는 queue 안에서의 인덱스이다.

- findIndex로 queue 내에서의 인덱스를 찾고 + 1 해줌
 최고 중요도가 9이고 중요도 9짜리 원소가 5개 있을 때, 나는 인덱스가 3인 원소를 찾고 있다면(location:3을 찾고 있음)
 element.index 가 3인 원소를 찾는 것이고, findIndex를 통해 중요도가 9인 원소만 모아둔 queue 내에서의 index를 찾는다.

- 몇번째로 요청이 처리됐는지는 + 1을 해줘야 함. 만약 내가 찾는 문서는 queue 내에서 index 가 2라면, 3번째로 인쇄된 것이므로 2에 +1 해준 것이 답임.
 

댓글