[큐] 기능개발

지은·2022년 11월 24일
1

Algorithm

목록 보기
7/33

문제

각 기능은 진도가 100%일 때 배포될 수 있다.
하지만 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발되어도, 앞에 있는 기능이 배포될 때 함께 배포된다.

입력값

  • progresses : 배포되어야 하는 순서대로 작업의 진도(%)가 적힌 배열
  • speeds : 각 작업의 개발 속도가 적힌 배열 (하루에 몇 %씩 진도가 나가는지)

출력값

각 배포마다 몇 개의 기능이 배포되는지를 배열로 리턴한다.

입출력 예

progressesspeedsreturn
[93, 30, 55][1, 30, 5][2, 1]
[95, 90, 99, 99, 80, 99][1, 1, 1, 1, 1, 1][1, 3, 2]

의사 코드

function solution(progresses, speeds) {
현재 완성 진도 : [95, 90, 99, 99, 80, 99] (%)
완성까지 걸리는 시간 : [5, 10, 1, 1, 20, 1] () <-- 이 배열이 필요하다.

1. 완성까지 걸리는 시간을 새로운 배열(days)로 구한다.
   남은 일수를 구하는 공식 : Math.ceil((100 - progress) / speed)

2. 이렇게 구한 days로..

큐를 하나 만들고 첫번째 요소를 넣어둔다.
카운트 변수를 하나 만들고 초기값으로 1을 준다.
결과를 담을 배열(result)을 하나 만든다.

반복문(배열을 순회하며) {
  만약 (요소가 큐의 맨 앞 요소보다 작다면) {
    요소를 하나씩 큐에 넣고, 카운트를 1 증가시킨다.
    }
  만약 (요소가 큐의 맨 앞 요소보다 크다면) {
    result 배열에 카운트를 넣고,
    카운트를 1로 초기화시키고,
    큐에 이 요소만 담는다.
    }
  }
  반복문이 끝나면, result 배열에 남은 카운트를 넣는다.
  result를 리턴한다.
}

풀이

function solution(progresses, speeds) {
  const days = progresses.map((el, idx) => {
    return Math.ceil((100 - el) / speeds[idx])
  });

  const queue = [days[0]];
  let count = 1;
  const result = [];
    
  for (let i = 1; i < days.length; i++) { 
    if (days[i] <= queue[0]) {
      queue.push(days[i]); 
      count++;
    } else {
      result.push(count);
      count = 1;
      queue = [days[i]];
    }
  }
  result.push(count);
  
  return result;
}

큐 배열 없는 풀이

function solution(progresses, speeds) {
  const days = progresses.map((el, idx) => {
    return Math.ceil((100 - el) / speeds[idx])
  });

  let count = 1;
  let maxDay = days[0]; // maxDay라는 변수에 최대값 저장해두기
  const result = [];
    
  for (let i = 1; i < days.length; i++) { 
    if (days[i] <= maxDay) {
      count++;
    } else {
      result.push(count);
      count = 1;
      maxDay = days[i];
    }
  }
  result.push(count);
  
  return result;
}

생각해보니 큐를 만들지 않았어도 풀 수 있었구나..


더 간결한 풀이

function solution(progresses, speeds) {
  let answer = [0];
  let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
  let maxDay = days[0];

  for(let i = 0, j = 0; i< days.length; i++){
    if(days[i] <= maxDay) {
      answer[j] += 1;
    } else {
      maxDay = days[i];
      answer[++j] = 1;
    }
  }

  return answer;
}

이건 내일 이해해보자 ^^..

profile
개발 공부 기록 블로그

0개의 댓글