728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
코드
function solution(progresses, speeds) {
let answer = [];
let day = []; //앞으로 남은 진행일 저장하는 배열
let count = 1; //한 번의 배포에 몇개의 기능이 배포되는지 count하는 변수 (최소 1개는 배포되는 것이니 초기값 1)
let max = 0; //한번에 배포될 기능들 중 진행일이 가장 길게 남은 일수를 저장할 변수
let len = progresses.length; //=speeds.length
for (let i=0; i<len; i++) {
day.push(Math.ceil((100-progresses[i])/speeds[i])); //올림함수 Math.ceil()을 통해 각각의 남은 진행일을 day에 push
}
for (let i=0; i<len; i++) {
max = day[i]; //남은 진행일 중 최대값 담아놓기
while (max > day[i+1] || max === day[i+1]) { //최대 진행일을 가진 기능보다 그 바로 다음 기능의 진행일이 적은 경우나 최대 진행일과 같은 경우에는
count++; //한번에 배포할 기능 +1
i++;
}
answer.push(count);
count = 1; //다시 초기화
}
return answer;
}
후기
- 처음 문제를 접근할 때, progresses, speeds 개수만큼 for문을 돌리고, 각 원소의 수에 따라 남은 진행일을 배열에 저장하여, 그 배열을 이용하여 답을 도출하자는 아이디어를 떠올렸다
- 그러기 위해서 제일먼저 진행일을 구해야했고, " (100-progresses[i])/speeds[i] " 코드를 떠올렸다. 이 코드는 소수점이 나올 경우도 있기 때문에 이를 해결하기 위해서는 반올림도 반내림도 아닌 그냥 올림을 하는 함수를 이용해야 했다. 다행히 자바스크립트에는 Math 객체에 ceil() 이라는 올림함수가 있었고, 이를 이용하여 쉽게 남은 진행일을 구할 수 있었다
- 맨 처음 풀 때는 max라는 변수를 사용하지 않고 풀었는데, 그랬더니 기본 테스트 케이스2번에서 오류가 발생했다. 해당 테케에서 남은 진행일이 [5, 10, 1, 1, 20, 1] 로 나왔는데, index 4번째에서 while문을 빠져나갔기 때문이다
- 이를 해결하고 나서 기본 테케를 모두 맞춘 후에 제출을 하였는데 자꾸 히든 테스트케이스 1, 2, 4, 5번에서 오류가 생겼다. 이를 해결하기 위해서는 progresses = [99, 99, 99], speeds = [1, 1, 1] 의 경우를 생각하였더니 해결할 수 있었다
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 두 개 뽑아서 더하기 / JavaScript (0) | 2022.01.08 |
---|---|
[Programmers] 124 나라의 숫자 / JavaScript (0) | 2022.01.08 |
[Programmers] 체육복 / JavaScript (0) | 2022.01.07 |
[Programmers] 2016년 / JavaScript (0) | 2022.01.07 |
[Programmers] 모의고사 / JavaScript (0) | 2022.01.06 |