본문 바로가기
Algorithm/Programmers

기능개발

by 동그란 혜주 2019. 6. 4.

· 문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

 

· 제한 사항

작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

 

· 입출력 예

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]

 

· 입출력 예 설명

첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

 


· Thinking 1

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] temp = new int[progresses.length];
		ArrayList<Integer> answer = new ArrayList<Integer>();

		for (int i = 0; i < progresses.length; i++) {
			int cnt = 0;
			while (true) {
				progresses[i] += speeds[i];
				cnt++;
				if (progresses[i] >= 100) {
					break;
				}
			}
			temp[i] = cnt;
		}

		int index = 1;
		while (index < progresses.length) {
			int cnt = 1;
			int j = index-1;
			while (j >= 0) {
				if (temp[index] <= temp[j]) {
					cnt++;
					j--;
				} else {
					break;
				}
			}
			answer.add(cnt);
			index++;
		}
		return answer.stream().mapToInt(i -> i).toArray();
    }
}

테스트 케이스 딱 한개만 통과.. 뭐가 문제일까 ㅠㅠ

 


· Thinking 2

예제 1)
progresses : [40, 93, 30, 55, 60, 65]
speeds : [60, 1, 30, 5 , 10, 7] // 1, 7, 3, 9, 4, 5
return : [1,2,3]

[ 1, 7, 3, 9, 4, 5 ]

temp(0) >= temp(1) ? no / cnt = 1 

-> temp.remove(0 ~ cnt-1)
[ 7, 3, 9, 4, 5 ]

temp(0) >= temp(1) ? yes / cnt = 2
temp(0) >= temp(2) ? no 

-> temp.remove(0 ~ cnt-1)
[9, 4, 5]

temp(0) >= temp(1) ? yes / cnt = 2
temp(0) >= temp(2) ? yes / cnt = 3

-> temp.remove(0 ~ cnt-1 )

예제 2)
progresses : [93, 30, 55, 60, 40, 65]
speeds : [1, 30, 5 , 10, 60, 7] // 7, 3, 9, 4, 1, 5
return : [2,4]

세 번이상의 시행착오를 통해......


· 완성 코드

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> temp = new ArrayList<Integer>();
		ArrayList<Integer> answer = new ArrayList<Integer>();

		for (int i = 0; i < progresses.length; i++) {
			int cnt = 0;
			while (true) {
				progresses[i] += speeds[i];
				cnt++;
				if (progresses[i] >= 100) {
					break;
				}
			}
			temp.add(cnt);
		}

		while (temp.size() != 0) {
			int cnt = 1;
			for (int j = 1; j < temp.size(); j++) {
				if (temp.get(0) >= temp.get(j)) {
					cnt++;
				} else {
					break;
				}
			}
			
			for (int i = 0; i < cnt; i++) temp.remove(0);
			
			answer.add(cnt);
		}

		return answer.stream().mapToInt(i -> i).toArray();
    }
}

리얼 감격스럽다....!
Arraylist를 remove 하게되면 해당 인덱스가 삭제되기 때문에

본래 인덱스가 i였던 값은 i-1이 된다는 것 명심..


· 다른 사람의 풀이

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

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] dayOfend = new int[100];
        int day = -1;
        
        for(int i=0; i<progresses.length; i++) {
            while(progresses[i] + (day*speeds[i]) < 100) {
                day++;
            }
            dayOfend[day]++;
        }
        
        return Arrays.stream(dayOfend).filter(i -> i!=0).toArray();
    }
}

어떻게 구현되는 원리인지 디버깅해봐야겠음 ㅠㅠ


· 문제 출처

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

 

알고리즘 연습 - 기능개발 | 프로그래머스

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇

programmers.co.kr

 

'Algorithm > Programmers' 카테고리의 다른 글

다음 큰 숫자  (0) 2019.06.04
다리를 지나는 트럭  (0) 2019.06.04
구명보트  (0) 2019.06.04
N개의 최소공배수  (0) 2019.06.04
JadenCase 문자열 만들기  (0) 2019.06.04

댓글