[프로그래머스] 기능개발 문제 풀이 - JavaScript

Haizel·2023년 10월 27일
1

🧬 알고리즘 풀이

목록 보기
48/53
post-thumbnail

💡 들어가기 앞서 안내말

이전에 진행했던 '나는 무엇을 풀었는가' 시리즈를 통해 프로그래머스 Level 0부터 다시 풀어보는 시간을 가졌는데, 어느덧 벌써 Level 2 에 진입했다.

이에 밀린 문제들에 대해 시리즈를 이어가는 대신, 매일 매일 푼 문제들에 대해 정리하여 포스팅하는 방식으로 변경하려고 한다.

알고리즘을 다시 공부하는 계기가 되었던 나는 무엇을 풀었는가 시리즈는 마무리하고, 앞으로는 데일리풀이를 통해 알고리즘 공부를 이어가보겠다!!


[프로그래머스] 기능 개발

문제

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

입/출력 예시

console.log(solution([93, 30, 55], [1, 30, 5])); // [2, 1]
console.log(solution([95, 90, 99, 99, 80, 99], [1, 1, 1, 1, 1, 1])); // [1, 3, 2]

Solution1

function solution(progresses, speeds) {
  let result = [];

  while (speeds.length > 0) {
    // 개발
    progresses.forEach((_, i) => (progresses[i] += speeds[i]));

    //배포
    let deployDay = 0;
    while (progresses[0] >= 100) {
      progresses.shift();
      speeds.shift();
      deployDay++; // 배포는 하루에 한번만 할 수 있기 때문에 배포하면 하루가 지나가게된다.
    }

    if (deployDay > 0) {
      result.push(deployDay);
    }
  }

  return result;
}

👉 Solution1 해설

  1. while문을 통해 speeds 배열이 빈 배열일 때까지 반복한다.
  2. while문 안에는 개발 과정과 배포 과정을 반복한다.
    2-1. 개발 과정 : forEach 메서드를 통해 각 프로세스마다 하루 작업량을 더해준다.
    2-2. 배포 과정 : 만약 progresses의 첫번째 요소가 100보다 크다면 progresses 배열과 speeds 배열의 첫번째 요소를 제거하고 deployDay는 하나 증가시킨다.
    • if문이 아닌 while문을 사용한 이유는 progresses 배열의 첫 요소가 100보다 큰 경우 해당 코드를 계속해 반복해줘야 하기 때문이다.
    • 100인 이유는 모든 공정은 100까지 진행된다고 기재되어있기 때문이다.
      2-3. deployDay가 0보다 크다면 해당 값을 result 배열에 push한다.
  3. 최종적으로 각 배포주기를 담은 배열 result를 리턴한다.

Solution2

function solution(progresses, speeds) {
  let result = [];
  let n = 0; // 인덱스 역할

  while (n < progresses.length) {
    progresses.forEach((_, i) => (progresses[i] += speeds[i]));

    let deployDay = 0;
    while (progresses[n] >= 100) {
      n++;
      deployDay++; 
    }

    if (deployDay > 0) {
      result.push(deployDay);
    }
  }

  return result;
}

👉 Solution2 해설

shift로 배열을 조작하지 않고, 변수 n을 이용해 index를 이동하는 방법도 가능하다.

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글