[프로그래머스/JS] 42587번 - 프린터

🔗 문제 링크

42587 - 프린터

📝 문제 설명

이 프린터는 배열의 맨 앞에 있는 문서의 중요도가 나머지 문서들보다 가장 높으면 인쇄를 하고 그렇지 않으면 배열의 가장 마지막에 넣는다.

문서의 중요도가 순서대로 담긴 배열 priorities와 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

🔑 문제 풀이

문제의 큰 흐름을 보면 맨 앞의 요소가 특정 조건을 만족할 경우에 배열에서 제거하고 그렇지 않을 경우에는 맨 뒤로 보낸다. 이 구조는 FIFO 자료구조인 Queue의 특징과 동일하기 때문에 Queue를 구현해서 해결해도 되지만 로직이 복잡한 문제는 아니라고 판단해서 구조를 참고만 하고 풀었다.

일단 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지를 추적하기 위해서는 id가 필요하다. 그래서 priorities 배열의 각 요소가 유일한 id를 가지도록 map 을 사용해서 idvalue를 속성으로 가지는 객체의 배열로 변환했다.

그리고 이 배열을 순회하면서 배열의 첫 요소의 값이 나머지 요소들의 값보다 크거나 같을 경우에 해당 요소를 제거하고 프린트 횟수를 +1 해준다. 이 때 제거된 요소가 몇 번째로 인쇄되는지를 추적하고 있던 요소인 경우에 break문으로 반복문을 탈출하고 그 시점의 프린트 횟수를 반환해주면 된다.

마지막으로 배열의 첫 요소의 값이 나머지 요소들의 값보다 작은 경우에는 제거한 첫 요소를 그대로 배열에 push 해주면 된다.

💻 소스 코드

function soultion(priorities, location) {
  const arr = priorities.map((v, i) => ({ idx: i, value: v }))
  let cnt = 0

  // 순회
  while (true) {
    let first = arr[0]
    let others = arr.slice(1)

    // 첫 번째 요소의 값이 다른 요소들의 값보다 모두 크거나 같으면 dequeue하고 cnt++
    if (others.every(v => first.value >= v.value)) {
      first = arr.shift()
      cnt++

      // dequeue한 요소가 location이면 순회 종료
      if (first.idx === location) break

      // 그렇지 않으면 dequeue한 거를 그대로 enqueue
    } else {
      arr.push(arr.shift())
    }
  }

  return cnt
}


Written by@Leo-Xee
안녕하세요. 꾸준함과 함께를 추구하는 프론트엔드 개발자 이장민입니다.

GitHub