본문 바로가기
알고리즘

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

by jaeeedev 2023. 7. 14.

문제 설명

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

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

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

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
  •  

푼 코드

function solution(progresses, speeds) {
  var answer = [];

  const rest = progresses.map((progress, i) => {
    return Math.ceil((100 - progress) / speeds[i]);
  });

  let count = 1;
  let temp = rest[0];

  for (let i = 1; i <= rest.length; i++) {
    if (temp >= rest[i]) {
      count++;
    } else {
      answer.push(count);
      temp = rest[i];
      count = 1;
    }
  }

  return answer;
}

console.log(solution([93, 30, 55], [1, 30, 5]));

 

먼저 각각 완료까지 남은 시간을 구하기 위해 (100 - progresses) 를 구해준다. 그리고 남은 시간을 구하기 위해 speed로 나누어 주었다.

 

그러면 rest는 [7,3,9] 값을 갖는 배열이 된다.

작업이 일찍 끝났다 해도 앞선 태스크가 완료됐을 때 함께 배포된다는 요구 사항이 있다. 그렇다면 앞 숫자(7)가 뒷 숫자(3)보다 큰 경우, 이 태스크들을 묶어야 한다. 바로 뒷 숫자만 비교하는게 아니라 [7,3,3,9] 이런 경우에도 대응할 수 있도록 temp 변수를 만들어 주었다. 계속 temp를 갱신해가며 뒤의 숫자들과 비교할 것이다.

 

temp[0]과 rest[0]은 동일하기 때문에 비교하는 과정이 무의미하다. 그래서 반복문이 1부터 시작되도록 했다.

 

걸린 시간이 동일할 경우 어떻게 처리할지를 모르겠어서 일단 temp가 작은 경우에만 배포되도록 제출했더니 일부 케이스에서 틀리다 나와서 같은 경우에도 배포를 합치도록 코드를 수정함 (구구절절하지만 그냥 >를 >=로 바꿨다는 말)

 

반복문이 i <= rest.length; 인 이유는 마지막에 일자가 묶이는 경우(뒷 숫자가 더 작은 경우) push가 되지 않고 함수가 끝나는 문제가 있어 무조건 else문으로 빠질 수 있도록 횟수를 추가했다. temp >= undefined 로 비교하기 때문에 좋은 방식이 아닐 수 있음.

 

스택/큐로 분류되어 있는 문제인데 그런 형태인걸 자각하고 풀지 못했던 것 같다. 좀 더 영리하게 풀고싶다...

그리고 은근히 원하는대로 동작하지 않아서 콘솔을 이리저리 많이 찍어봤다.

댓글