-
내 풀이법
문제해석
- 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