Don't give up!

[코딩테스트] 기능개발(프로그래머스) 본문

Coding Test/Programmers

[코딩테스트] 기능개발(프로그래머스)

Heang Lee 2021. 4. 28. 22:51

코딩테스트 연습 - 기능개발 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

문제해석

개발에 소요된 기간 계산은 {100-(작업진도)}/(개발속도) 로 계산할 수 있습니다.

먼저 개발된 기능은 순서상 앞에 있는 기능의 배포와 함께 이루어지므로 이전 기능의 개발 기간과 대소 비교를 통해 문제를 해결할 수 있다고 생각하였습니다.

 

풀이

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int max=-1;
        int[] commits = new int[progresses.length];
        int index=-1;
        for(int i=0; i<progresses.length; i++){
            int remain = 100 - progresses[i];
            int days = remain/speeds[i];
            if(remain%speeds[i]!=0) days += 1;
            if(days > max){
                max = days;
                index++;
            }
            commits[index]++;
        }

	int[] answer = new int[index+1];
        for(int i=0; i<index+1; i++){
        	answer[i] = commits[i];
        }

        return answer;
    }
}

개발 기간 7.2일은 8일차에 배포가 되는 것이므로 나머지 연산 %의 값이 0이 아니라면 +1을 하는 방식으로 배포시기를 계산하였습니다.

이전 기능의 개발 기간 중 가장 큰 값을 max에 저장, 배포 순서대로 기능의 수를 배열에 저장한 후 배열의 크기를 줄이는 방식으로 코드를 구현하였습니다.

이 코드만으로도 테스트는 통과하였지만 java의 기능들을 활용한다면 코드를 줄일 수 있을 것이라고 생각하였습니다.

 

개선

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] commits = new int[100];
        int max = -1;
        for(int i=0; i<progresses.length; i++){
            int days = (int)Math.ceil( (100 - progresses[i]) / (double)speeds[i] );
            if(days > max) max = days;
            commits[max]++;
        }
        
        return Arrays.stream(commits).filter(i -> i!=0).toArray();
    }
}

Math.ceil 함수는 주어진 숫자를 반올림합니다.

반올림이 가능하므로 double 형식의 나눗셈 결과 -> 반올림된 int형 변수로 계산 결과를 반환하였습니다.

Stream의 filter는 조건에 부합하는 원소만을 선택하여 배열을 형성합니다.

값이 0이 아닌 원소들만을 보다 쉽게 얻어낼 수 있으므로 배열을 '날짜마다 배포된 기능 수'로서 저장할 수 있고 index와 같은 변수를 사용하지 않아도 구현할 수 있게 되었습니다.