프로그래머스 기능개발 [Java]

문제출처

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> answer_list = new ArrayList<>();
        int idx = 0;
        while(idx < progresses.length){
            int count = 1;
            int day = (100 - progresses[idx]) / speeds[idx];
            if((100 - progresses[idx]) % speeds[idx++] != 0) {
                day++;
            }
            
            while(idx < progresses.length && 100 - progresses[idx] <= speeds[idx] * day){
                count++;
                idx++;
            }
            answer_list.add(count);
        }
        return answer_list.stream().mapToInt(i->i).toArray();
    }
}

문제에는 스택/큐라고 써있긴한데 스택이나 큐를 사용하진 않았다...

 

접근방법

idx로 현재 접근한 progress를 우선 확인 후 이걸 완료하는데에 필요한 day를 구한다.

다음 progress를 접근해 day내에 다음 작업들을 처리 할 수 있는지 확인 후 카운트해준다.

 

접근 자체는 처음에 바로 떠올렸는데 테스트 케이스 1, 2, 4, 5였나 아무튼 4개정도 틀렸다.

결국 질문게시판 뒤지기 찬스

 

반례로

progresses: [96, 99, 98, 97]
speeds: [1,1,1,1]
answer: [4]

를 추가하라고 했다.

 

이 반례로 고친 부분은 while문 안의 while문에서 100 - progresses[idx] <= speeds[idx] * day이 부분의 부등호를 내가 처음에는 <라고 했었다. 일치하는 경우도 생기기 때문에 =를 추가해주니

1,5는 맞았다.

 

2, 4의 문제는 처음 day를 구하는 부분이었다.

내가 처음에 작성한 코드에서 day는

double day = Math.ceil((100 - progresses[idx]) / speeds[idx++]);

이렇게 구했었다.

 

질문게시판에서 찾은 반례는 아니고 내가 새롭게 추가한 테스트 케이스는

progresses: [93, 30, 55]

speeds: [6, 50, 50]

answer: [3]

이것.

 

progress가 speed로 완벽하게 나누어 떨어지지 않는 경우에 그냥 올림을 해주면 되지 않을까? 단순하게 생각했는데

위 반례의 경우에 93일때 내 예상으로는 day에 2.0이 들어가야하는데 1.0이 들어가는 일이 생기고 있었다.

내 예상으로는 progresses와 speeds가 모두 int형이기 때문에 (100 - progresses[idx]) / speeds[idx++]의 결과가 그냥 1으로 나오는 상태에서 ceil을 해주니 1.0이 된것 같다.

저 방법대로 하려면 ceil안 부분을 double로 변환을 해주든지 해야할듯​

 

아무튼 day를 int형으로 바꾸고 ceil을 사용하지 않는 쪽으로 고쳐주었다.

myoskin