본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 프린터

by StelthPark 2022. 3. 16.

처리조건

풀이

입력 : solution([2, 1, 3, 2], 2);

 

priorities 는 대기목록이며 location은 이 priorities 에서 출력이 완료된 순서목록에서 찾을 index이다.
대기목록에서 조건에 맞게 프린터를 하고 난 순서에서 우리는 location을 찾을 것이고 대기목록에서 출력이 완료된 문서는 사라질 것이니 작업전에 각 우선순위를 담은 객체를 생성하였다.

 

키는 인덱스로 값은 우선순위를 넣어 생성한다. 이후 대기목록의 첫번째 문서의 우선순위를 객체에서 불러오고 이후 for문을 돌려 두번째 문서들부터 하나하나 비교해가면서 만약 한번이라도 첫번째 문서보다 큰 우선순위가 있다면 첫번째 문서를 shift하여 맨 뒤에 push한다. 

 

만약 없다면 j가 대기문서의 끝까지 검사했다는 else if문을 처리하게 되고 이는 즉 첫번째 문서보다 더 큰 우선순위문서는 없다는 것이므로 이 문서를 shift하고 출력순서가 저장되는 result에 push한다. 

 

해당 처리를 while문을 돌려서 대기목록의 길이가 0이되어야 모두 출력된 것이므로 대기목록길이가 0이 될때 까지 돌리게된다. 여기서 대기목록의 길이가 1이되면 더이상 자신과 비교할 문서가 없으니 본인만 shift하여 result에 푸시하고 끝이나게 된다.

 

location을 찾을때 result에서 location이 위치한 indexOf를 찾고 +1해서 리턴해준다. 그이유는 아래와 같다.

이렇게 시작전에 location이 2이면 대기목록에서 0번째부터 인덱스가 2인 값을 찾아야한다. 제한사항 중 location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현해야한다는 점을 잘 확인해보면 된다.

 

문제는 쉬웠다. 하지만 마지막에 return해주는 부분에서 결과를 잘못 입력해서 테스트가 자꾸 실패했고 잠깐 집중력이 떨어져서 잘못 생각했던 것 같다. location의 조건을 잘 생각해보고 다시 떠올려서 풀면 쉽게 풀 수 있다.

 

function solution(priorities, location) {
  const result = [];
  const list = new Object();
    
  for (let i = 0; i < priorities.length; i++) {
    list[[i]] = priorities[i];
    priorities[i] = i;
  }

  while (true) {
    if (priorities.length === 0) break;

    for (let j = 1; j < priorities.length; j++) {
      if (list[priorities[0]] < list[priorities[j]]) {
        priorities.push(priorities.shift());
        break;
      } else if (j === priorities.length - 1) {
        result.push(priorities.shift());
      }
    }

    if (priorities.length === 1) {
      result.push(priorities.shift());
    }
  }

  return (result.indexOf(location) + 1);
}

댓글