[Lv2] 프린터

Creating the dots·2022년 1월 19일
0

Algorithm

목록 보기
54/65
post-custom-banner

프로그래머스

나의 풀이

모든 테스트케이스가 5~8ms 정도 걸렸다. 배열을 복사해서 내림차순 정렬시켜 0번째 값과 비교하려고 하였는데, 그 과정에서 copied, value 등 여러 변수를 사용하고, 원본배열 요소의 데이터타입을 문자열로 변경시켰다. 그래서, 가독성과 기능이 아쉽다.

수도코드

  • cnt는 인쇄 횟수를 카운트한다.

  • copied는 인자로 받은 priorities를 복사해 오름차순 정렬한다.

  • 기존 priorities 배열의 location번째 값을 문자열로 변환시켜 같은 중요도를 갖더라도, 내가 인쇄하려는 요청임을 표시한다.

  • priorities가 빈배열이 아닐때까지 반복한다

    • 가장 첫번째 목록을 꺼낸다.
    • 꺼낸 목록이 가장 중요한지 확인한다. (==)
      • 맞다면, 인쇄 횟수를 카운트하고 copied shift
        • 만약 꺼낸 목록이 내가 요청한 인쇄라면 (===)반복문 끝내기
      • 아니라면, priorities에 다시 push
  • cnt 리턴하기

function solution(priorities, location) {
  let cnt = 0;
  
  const copied = priorities.slice();
  copied.sort((a,b) => b-a); 
  
  priorities[location] += "";
  const value = priorities[location];
  
  while(priorities.length) {
    const list = priorities.shift();
    if(list == copied[0]) {
      cnt++;
      copied.shift();
      if(list === value) break;
    } else{
      priorities.push(list);
    }
  }
  return cnt;
}

다른 분의 풀이(1) 가독성👍

다양한 map, some, findIndex 메소드를 사용해서 코드를 이해하기 쉬웠다. 그런데, 사용한 모든 메소드들이 반복문을 사용해서 콜백함수를 실행시키기 때문에 시간이 더 오래걸린다. 8번 테스트케이스의 경우, 이 풀이로는 10ms 이상 소요되었지만, 위의 풀이로는 5ms 정도 소요되었다. priorities의 배열의 크기가 커질수록 다른 풀이에 비해 소요되는 시간이 더 오래걸리는 것 같다.

  • map을 사용해서 priorities 배열을 통해 알 수 있는 정보를 객체로 저장하고, 새로운 배열 arr 에 맵핑한다.
    ex.
    [{ index: 0, priority: 2 }, { index: 1, priority: 1 }, { index: 2, priority: 3 }, { index: 3, priority: 2 }]

  • 반복문으로 arr의 첫번째 요소를 꺼낸다.

    • 꺼낸 요소의 중요도와 some을 사용해서 arr의 요소의 중요도를 비교해 hasHighPriority에 true, false를 저장한다.
      • 만약 hasHighPriority가 true이면, 다시 arr에 푸시
      • hasPriority가 false이면, queue에 푸시
  • 프린트된 요소가 queue에 순서대로 저장되므로 findIndex 메소드를 사용해서 프린트된 요소.index와 location이 같은 요소의 인덱스를 구한다. 구한 인덱스에 1을 더해 리턴한다. (순서대로 저장되었으므로 인덱스+1을 하면 몇번째로 프린트되었는지 알 수 있다.)

function solution(priorities, location) {
  var arr = priorities.map((priority, index) => {
    return {
      index: index,
      priority: priority
    };
  });
  
  var queue = [];
  
  while(arr.length) {
    var firstEl = arr.shift();
    var hasHighPriority = arr.some(el => el.priority > firstEl.priority);
    if(hasHighPriority) {
      arr.push(firstEl);
    } else {
      queue.push(firstEl);
    }
  }
  return queue.findIndex(queueEl => queueEl.index === location) + 1;

다른 분의 풀이(2) 가독성 & 속도👍

모든 테스트케이스가 1ms 미만으로 걸렸다. 이 풀이는 priorities 배열이 바뀌는 것에 맞춰서 location의 값을 변경해주었다. 이해하기 쉬우면서도 가장 빠른 풀이인 것 같다.

function solution(priorities, location) {
  var answer = 0; 
  
  while(priorities.length>0) {
    const job = priorities.shift();
    if(priorities.some(i => i>job)){
      priorities.push(job);
      location = location==0 ? priorities.length-1 : location-1;
    } else{
      answer++;
      if(location == 0) return answer;
      else location--;
    }
  }
  return answer;
}
profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글