본문 바로가기
코테연습

73. 프린터 Javascript

by hxunz 2022. 7. 1.

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 인쇄를 요청한 문서가 몇번째로 인쇄되는가?
  • 주어진 자료는 무엇인가?
     - priorities : 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열
     - location : 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려준다
  • 조건은 무엇인가?
     -
    현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
     - 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
     - location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
     - 프린터의 작업 방식

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

 

2. 계획

  • 전에 비슷한 문제를 알고 있는가?
  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
  • 비슷한 문제를 풀어본 적이 있다면 그 것을 활용할 수 있는가?
  • 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
  1. priorities의 길이만큼 유니크한 값을 새로 만든다.
  2. 이 배열에서 첫번째 값이 중요도가 가장 높은지 확인한다
    2-1. 이 값을 인쇄하고 count 1을 해준다
    2-2. 이 값이 요청한 문서라면 count 값을 리턴한다.
  3. 이 첫번째 값이 가장 중요도가 높은 값이 아니라면 맨 뒤로 보낸다.
  4. 2, 3번을 반복한다.

 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const checkPrinterOrder = (newPriorities,location,count = 0) => {
  const maxPriority = Math.max(...newPriorities.map((it) => it[1]));
  const firstPriority = newPriorities[0];
  if (maxPriority === firstPriority[1]) {
    newPriorities.shift();
    count++;
    if (location === firstPriority[0]) {
      return count;
    }
  } else {
    newPriorities.push(firstPriority);
    newPriorities.shift();
  }
  return checkPrinterOrder(newPriorities, location, count);
}
  
const printer = (priorities,location) => {
  const newPriorities = priorities.map((it, index) => [index, it]); 
  return checkPrinterOrder(newPriorities, location);
};

test('printer', () => {
  expect(printer([2, 1, 3, 2], 2)).toEqual(1);
  expect(printer([1, 1, 9, 1, 1, 1], 0)).toEqual(5);
  expect(printer([4, 7, 2, 1, 3, 9, 4],4)).toEqual(5);
});

 

 

 

문제를 완전히 이해하지 못하고 잘못된 방향으로 풀고있었다.. 
그래서 운좋게 몇개의 테스트 케이스는 통과했는데 대부분의 테스트 케이스는 통과하지 못했다.
문제를 이해하지 못하니 왜 틀렸는지에 대한 생각도 할 수가 없었다.

나중에 다시 문제를 처음부터 읽어보니 인쇄라는 부분을 다시 생각해보게 되었다.
말 그대로 해당 문서를 인쇄, 즉 제거하고 나머지 출력물들을 토대로 다시 우선 순위를 정하고 정렬하고 인쇄하는,,
이런 순환되는 흐름을 찾았고 계획을 다시 처음부터 짰다.

문서를 인쇄하면 나머지 문서들 사이에서의 제일 높은 중요도가 바뀌는 부분을 처리했고 
첫번째 문서가 중요도가 제일 높은게 아니라면 맨뒤로 보내고
중요도가 제일 높은것이라면 인쇄해주고 
인쇄를 할때마다 count 값을 1씩 올려주었다. 
이렇게 해줘야지 요청한 문서를 몇번째에 인쇄할 수 있는지 확인할 수 있다고 생각했기 때문이다.
다시 나머지 문서들 중에서 제일 높은 중요도가 무엇인지 정해서 위 행동을 반복하도록 해주었다.
여기서 기저조건은 첫번째 문서가 중요도가 제일 높은 문서임과 동시에 요청한 문서인 경우이니까 이 부분도 처리해주었다.

이렇게 문제를 해결했는데 문제 이해도가 중요하다는 것을 알게 되었고 
문제가 풀리지 않는다면 문제를 다시 읽어 보고 조건이 빠진 것이 없는지 계획은 제대로 된 건지 확인 할 수 있도록 해야겠다.

'코테연습' 카테고리의 다른 글

75. 소수찾기 Javascript  (0) 2022.07.05
74. 피보나치 수 Javascript  (0) 2022.07.04
72. 가운데 글자 가져오기 Javascript  (0) 2022.06.30
71. 오픈채팅방 Javascript  (0) 2022.06.28
70. 카펫 Javascript  (0) 2022.06.27

댓글