기능개발

박효상·2022년 4월 7일
0

코딩테스트

목록 보기
5/5
post-thumbnail

Problem

각 기능 작업의 진도가 담긴 progresses 배열, 각 기능 작업의 속도가 담긴 speeds 배열을 활용하여, 각 배포마다 몇개의 기능이 배포되는지 배열에 담아 반환하는 함수 구현

Algorithm

  • 스택 : 데이터가 담길 때, LIFO(Last-In-First-Out) 즉 후입선출의 특징을 띄는 자료구조이며, 한 쪽 끝에서만 데이터가 들어가고 나올 수 있는 선형구조
  • 큐 : 데이터가 담길 때, FIFO(First-In-First-Out) 즉 선입선출의 특징을 띄는 자료구조이며, 한 쪽 끝에서 데이터가 들어와 반대편 끝으로 나오는 선형구조

Solution

  • 사실 이 문제는 작업이 완료되는 순으로 순차적으로 배포되는 방식이기에 FIFO인 큐 알고리즘으로 풀어야 되지만, 더 간단한 방법이 있어 다르게 풀어보았다
  1. remainDays라는 각 작업의 배포까지 남은 일 수를 담는 배열 선언
  2. progresses를 순회하여 각 작업당 남은 개수를 각 작업 속도로 나눠 배포까지 남은 일수를 remainDays에 담기
  3. remainDays를 순회하여 해당 남은 일수가 만약 초기 설정한 최댓값 이하라면, answer의 해당 배포 텀에 배포 카운트 1 증가
  4. remainDays를 순회하여 해당 남은 일수가 만약 초기 설정한 최댓값 초과라면, 최댓값이 해당 남은 일수로 변경되고, answer의 배포 텀이 변경되면서 카운트 1하기
  5. 배포 텀별 배포 기능 수가 담긴 answer 배열을 반환
function solution (progresses, speeds) {
  let answer = [0], remainDays = [], answerIdx = 0; 
  remainDays = progresses.map((progress, i) => Math.ceil((100-progress)/speeds[i]));
  let max = remainDays[0];
  for (let i = 0; i < remainDays.length; i++) {
    if (remainDays[i] <= max) {
      answer[answerIdx]++;
    }
    else {
      max = remainDays[i];
      answer[++answerIdx] = 1; 
    }
  }
  return answer;
}
profile
집념의 백엔드 개발자

0개의 댓글