프린터 (스택/큐)

연쇄코딩마·2021년 1월 25일
0
post-thumbnail

설명 : 프로그래머스

간단 설명 : 회사에서 프린터를 개발하였는데, 중요도가 높은 문서들을 먼저 인쇄하는 프린터를 개발했다.

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

이와 같은 방식으로 수행되며 priorities에 각 프린트에 우선순위가 정해져 있있다. 나의 프린트물은 location(0부터 시작)에 있으며 몇번째에 프린트가 될까? 리턴하는 문제이다.

번호prioritieslocationreturn
1[2, 1, 3, 2]21
2[1, 1, 9, 1, 1, 1]05

입출력 설명

  1. 나의 프린트물은 2(3번째)이다. 우선순위는 3이다. 그래서 제일 첫번째(1)로 프린트된다.
  2. 나의 프린트물은 0(1번째)이다. 우선순위는 1이다. 그래서 5번째에 프린트된다.

수도코드

프린트갯수선언
나의 프린트 선언
priorities 배열을 한바퀴 루프를 돌아야함
문제 설명에 보듯이 제일 앞의 벨류의 우선순위보다 높은것이 있다면 뒤로 보냄
그렇지 않으면 프린트하고 만약에 그 프린트가 되면 차례(location)가 줄어드는데 0이 되면 print횟수를 리턴하면 답이된다.

코드

function solution(priorities, location) {
  let printCount = 0;
  let myDoc = location;

  while (priorities.length > 0) {
    let firstDoc = priorities.shift();//앞에서 제거
    let prior = priorities.filter((e) => e > firstDoc); 
    if (prior.length > 0) {//만약에 우선순위가 제거된 거보다 큰것이 없다면 뒤로 다시 푸쉬하고 넣음
      priorities.push(firstDoc);
    } else {
      //만약에 우선순위가 제거된 거보다 큰것이 있다면 프린트해버리고 프린트 숫자가 늘면 차례가 줄어든다. 그렇기 때문에 myDoc 즉 location이 0이라면 그 printCount를 리턴하면 답이된다.
      printCount++;
      if (myDoc === 0) {
        return printCount;
      }
    }
    myDoc--;// 차례는 우선순위를 따질때 마다 줄어든다.
    if (myDoc === -1) { //만약에 차례가 0을 지나 마이너스가 된다면 뒤로 간것이기 때문에 다음과 같이 처리를 해준다 
      myDoc = priorities.length - 1;
    }
  }
}

회고 : 계속 필터, 맵등 메소드의 중요성을 꺠달고 있다. 기초를 좀더 단단하게 쌓아야 겠다.

profile
只要功夫深,铁杵磨成针

0개의 댓글