코테 준비

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

우디혜 2020. 10. 13. 22:09

로직

배포에 필요한 일수를 각각 계산한 뒤 해당 리스트를 순회한다.

앞의 일수가 pivot이 되어

  • pivot >= day 일 경우
    → 함께 배포해야하기 때문에 count
  • pivot < day 일 경우
    → 다음 날 배포해야하기 때문에 count를 리턴할 리스트에 넣어주고 현재 day가 새로운 pivot이 되어 새로 count를 시작한다.

 

코드

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] days = new int[speeds.length];
        ArrayList<Integer> deployment = new ArrayList<Integer>();      
        
        // get days
        for(int i = 0 ; i < days.length; i++){
            double rest = (double) 100 - progresses[i];
            double needDays = Math.ceil(rest / speeds[i]);
            days[i] = (int) needDays;
        }
        
        // deployment group
        
        int deployDay = days[0], count = 0;
        for(int day : days){
           if(deployDay < day){
               deployment.add(count);
               count = 1;
               deployDay = day;
           } 
            else count +=1;  
        }
        
        deployment.add(count);
        
        return deployment.stream().mapToInt(i -> i).toArray();
    }
}

 

여기서 주의해야할 점은

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

이 아니라는거다.

 

stackoverflow.com/questions/32571909/java-integer-double-division-confusion

 

Java integer-double division confusion

Program 1 int sum = 30; double avg = sum / 4; // result is 7.0, not 7.5 !!! VS. Program 2 int sum= 30 double avg =sum/4.0 // Prints lns 7.5 Is this because the '4' in program 1 is acting ...

stackoverflow.com

 

 

int sum = 30;
double division = sum / 4;
// 답은 7.0

double division2 = (double) sum / 4;
// 답은 7.5
// 연산자 우선순위에서 type casting이 높기 때문에 sum을 doulbe로 casting 해준 뒤에 / 연산을 한다​

int와 double을 혼용하여 연산을 진행할 때 주의해야한다.