[Lv2] 기능개발

Creating the dots·2022년 1월 18일
0

Algorithm

목록 보기
53/65

프로그래머스

나의 풀이

progresses의 길이만큼만 반복문을 돌면 되므로, 모든 테스트가 0.1초 미만으로 빠르게 통과했다.

수도코드

  • const deployday = progresses의 0번째 작업이 끝나 배포되기까지 걸리는 일수
  • 반복문
    • 배포까지 걸리는 일수가 deployday보다 작거나 같은 기능들을 카운트한다.
    • 배포까지 걸리는 일수가 deployday보다 큰 경우, 지금까지 카운트한 기능을 배열에 푸시하고, 카운트=1, deployday=배포까지 걸리는 일수로 초기화한다.
  • 마지막으로 배포되는 기능의 수는 배열에 푸시되지 않으므로 반복문이 끝나고 배열에 푸시한다.
  • 배열을 리턴한다.
function solution(progresses, speeds) {
  let deployday = Math.ceil((100-progresses[0])/speeds[0]);
  let features = 1;
  const res = [];
  for(let i=1; i<progresses.length; i++){
    const days = Math.ceil((100-progresses[i])/speeds[i]);
    if(deploydays>=days) features++;
    else{
      res.push(features);
      deployday = days;
      features = 1;
    }
  }
  res.push(features);
  return res;
}

다른분의 풀이

이 풀이를 통해 반복문 안에서 하나의 변수만 사용했는데, 2개 이상의 변수를 선언하는 것과 ++를 쓰는 위치에 따라 다르게 기능하는 것을 배웠다.
그런데, 속도의 측면에서는 map과 반복문을 사용해서 평균 5초 정도의 시간이 걸렸다. 이 풀이에서는 각 기능이 완성되기까지 걸리는 일수를 days 배열에 저장했는데, 이 과정은 시간을 오래걸리게 만들어서 생략하는 것이 속도를 향상시킬 수 있을 것 같다.

  • answer는 리턴할 배열
  • days는 각 기능이 완성되기까지 걸리는 일수를 저장한 배열
  • maxDay는 첫번째 기능이 완성되기까지 걸리는 일수로 초기화
  • days 배열을 반복문으로 방문하면서,
    • 요소가 maxDay보다 작거나 같으면, answer의 j번째 값++해준다.
    • 요소가 maxDay보다 크다면, answer의 j+1번째 값에 1을 할당한다.
      • 여기서 answer[++j] = 1;은 answer의 j+1번째 인덱스가 된다는 것을 의미하고, 만약 answer[j++] = 1과 같이 작성하면, 우선 answer의 j번째 인덱스가 1이고, j++된다.
function solution(processes, speeds) {
  let answer = [0];
  let days = processes.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개의 댓글