Algorithm/Programmers

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

ikjo 2022. 5. 8. 20:49

문제 설명

 

 

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

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

programmers.co.kr

 

접근 방법

우선 주어진 int형 배열 progresses에 대해 각각의 기능별로 배포하는데 까지 걸리는 시간을 구합니다.

 

        int countOfProgresses = progresses.length;
        int[] days = new int[countOfProgresses];
        for (int i = 0; i < countOfProgresses; i++) {
            days[i] = (int) Math.ceil( ((double) (100 - progresses[i])) / speeds[i] );
        }

 

이후 첫 번째 기능부터 순회하여 다음 기능이 배포되는데 까지 걸리는 시간을 비교합니다. 이때 다음 기능이 첫 번째 기능 보다 개발하는데 걸리는 시간이 같거나 적다면 첫 번째 기능이 배포될 때 다음 기능도 같이 배포되므로 count를 증가시킵니다. 아울러 이미 배포가 되었다면 다음에 순회할 때 중복 처리가 되면 안되므로 별도로 boolean형 배열을 선언하여 방문 처리를 해주도록 했습니다. 반대로 다음 기능이 첫 번째 기능 보다 개발하는데 걸리는 시간이 크다면 이후에 배포 되므로 첫 번째 기능을 기준으로 순회하는 for문에서 break시키고 다음 기능을 기준으로 순회하여 다다음 기능이 배포되는데 까지 걸리는 시간들을 비교합니다. 

 

        List<Integer> result = new ArrayList<>();
        boolean[] visited = new boolean[countOfProgresses];
        
        for (int i = 0; i < countOfProgresses; i++) {
            if (visited[i]) continue;
            int target = days[i];
            int count = 1;
            for (int j = i + 1; j < countOfProgresses; j++) {
                if (target >= days[j]) {
                    count++;
                    visited[j] = true;
                }
                else {
                    break;
                }
            }
            result.add(count);
        }

 

 

전체 소스 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {

    public int[] solution(int[] progresses, int[] speeds) {

        int countOfProgresses = progresses.length;
        int[] days = new int[countOfProgresses];
        for (int i = 0; i < countOfProgresses; i++) {
            days[i] = (int) Math.ceil( ((double) (100 - progresses[i])) / speeds[i] );
        }

        List<Integer> result = new ArrayList<>();
        boolean[] visited = new boolean[countOfProgresses];
        
        for (int i = 0; i < countOfProgresses; i++) {
            if (visited[i]) continue;
            int target = days[i];
            int count = 1;
            for (int j = i + 1; j < countOfProgresses; j++) {
                if (target >= days[j]) {
                    count++;
                    visited[j] = true;
                }
                else {
                    break;
                }
            }
            result.add(count);
        }


        return result.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

참고자료