99클럽 코테 스터디 3일차 TIL [프로그래머스] 기능개발 (Java)

민경·2024년 5월 22일

문제

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

풀이

  • 각 progress의 잔여 작업일을 days 배열에 저장한다.
    • 100에서 progresses를 빼고, speeds로 나눔
  • 배열을 순회해 현재 작업 중인 작업(now)과 작업일이 같거나 더 적은 요소를 카운트한다.
  • 작업일 수가 더 많은 경우, 지금까지 카운트된 기능을 배포하고 새롭게 카운트를 시작한다.

틀린 코드

import java.util.*;

class Solution {
    public List<Integer> solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        int[] days = new int[progresses.length];
        for(int i = 0; i < progresses.length; i++) {
            days[i] = (int) Math.ceil((100-progresses[i])/speeds[i]);
        }
        int cnt = 1;
        int now = days[0];
        for(int i = 1; i < days.length; i++) {
            if(days[i] <= now) {
                cnt++;
            } else {
                answer.add(cnt);
                cnt = 1;
                now = days[i];
            }
        }
        answer.add(cnt);
        return answer;
    }
}

틀린 이유

days[i] = (int) Math.ceil((100-progresses[i])/speeds[i]);

해당 라인에서 문제가 발생했다.
정수의 나눗셈은 소숫점을 버리기 때문에 올바른 결과가 도출되지 않을 수 있다.
따라서 실수 나눗셈을 수행한 후 Math.ceil을 수행하고, int형으로 변화이 필요하다.

정답 코드

import java.util.*;

class Solution {
    public List<Integer> solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        int[] days = new int[progresses.length];
        for(int i = 0; i < progresses.length; i++) {
            days[i] = (int) Math.ceil((100.0 - progresses[i]) / speeds[i]);
        }
        int cnt = 1;
        int now = days[0];
        for(int i = 1; i < days.length; i++) {
            if(days[i] <= now) {
                cnt++;
            } else {
                answer.add(cnt);
                cnt = 1;
                now = days[i];
            }
        }
        answer.add(cnt);
        return answer;
    }
}
profile
강해져야지

0개의 댓글