ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기능개발
    알고리즘 2021. 9. 1. 20:57

     

    내 풀이법

    문제해석

    • progresses 배열 내에는 개발의 진도를 엘리먼트로 갖고 있는 일의 양을 확인할 수 있다. speeds의 배열 내 각 index의 엘리먼트에 따라 하루 개발 진도량이 추가된다! 
    • 일의 진도가 100에 도달하면 개발은 끝나 배포된다! 즉 배열내에서 삭제됨!
    • 가장 앞의 일이 먼저 끝나야 그 후의 일도 같이 배포 가능하다. ex) [95, 100, 100, 100] 의 상태여도 95가 100에 도달해야 나머지도 전부 배포가능하다
    • 리턴 값은 한번 배포할 때 몇개의 개발 수가 배포되는지 배열로 나타내면 된다.

     

    내가 생각한 풀이법

    • map 함수를 사용하여 하루에 progressess 배열의 개발진도량을 항상 체크한다
    • progresses의 첫번째 배열이 100이상이면 개발진도량 전부 확인하여 완료한 개발을 배포한다.

     

    나의 코드

    function solution(progresses, speeds) {
      var answer = [];
      let before;
      let after;
      let temp = [];
      let erase;
    
      while (progresses.length > 0) {
        progresses = progresses.map((progress, index) => progress + speeds[index]);
        if (progresses[0] >= 100) {
          before = progresses.length;
    
          for (let j = 0; j < progresses.length; j++) {
            if (progresses[j] < 100) {
              temp.push(j);
            }
          }
    
          erase = temp[0];
    
          if (erase === undefined) {
            answer.push(progresses.length);
            progresses = [];
            break;
          } else {
            for (let k = 0; k < erase; k++) {
              progresses.shift(k);
              speeds.shift(k);
            }
          }
    
          after = progresses.length;
          answer.push(before - after);
          temp = [];
        }
      }
    
      return answer;
    }

     

    코드특징

    • while문과 map 함수를 사용하여 progresses[] 내 element을 speed[]에 맞게 업데이트한다.
    • progresses[0] >=100 인 경우 progresses[] 내를 확인하여 개발진도량을 체크한다
    • progresses[] 내 엘리먼트를 하나하나 확인하기 for 문을 사용
    • 가장 앞의 일이 먼저 끝나야 그 후의 일도 같이 배포 가능하다는 조건 때문에 let temp; let erase; 등을 사용함

     

    코드성능

     

    • while문 내에 map함수를 사용하여 성능에 큰 문제가 있음
    • 비교적 간단한 테스트 1도 시간이 너무나 오래 걸림

     

    다른사람 풀이법

    function solution(progresses, speeds) {
      let leftDays = [];
      let answer = [];
      for (let i = 0; i < progresses.length; i++) {
        leftDays.push(Math.ceil((100 - progresses[i]) / speeds[i]));
      }
    
      let countWorks = 1;
      let prevWork = leftDays[0];
      for (let i = 1; i < leftDays.length; i++) {
        if (prevWork >= leftDays[i]) {
          countWorks++;
        } else {
          prevWork = leftDays[i];
          answer.push(countWorks);
          countWorks = 1;
        }
      }
    
      answer.push(countWorks);
    
      return answer;
    }

    코드특징

    • 하루동안의 개발진도량이 아닌 각 개발의 전체 기간을 미리 계산을 함
    • 각 개발의 전체 기간을 먼저 구한 후 배포 조건에 맞춰 정답 계산

     

    코드성능

     

    오늘 배운점

    • 알고리즘이 너무 복잡해지면 다른 풀이법이 있는지 다시 생각해보자!
    • 하루 개발량 등 미시적인 것보다 전체 개발 기간과 같은 거시적인 관점에서 먼저 접근을 해보자! 

    '알고리즘' 카테고리의 다른 글

    다리를 지나는 트럭  (0) 2021.09.13
    스킬트리  (0) 2021.09.11
    영어 끝말잇기  (0) 2021.09.09
    구명보트  (0) 2021.09.08
    폰켓몬 (알고리즘)  (0) 2021.08.28
Designed by Tistory.