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

이찬혁·2024년 4월 29일

알고리즘

목록 보기
51/72

프로그래머스 Lv2 - 기능개발 문제

프로그래머스 레벨 2 기능개발 문제를 풀이했다.
문제 분류는 스택/큐로 되어있었고, 나는 리스트를 통해 풀이했지만 리스트 부분을 큐로 변경하여 풀이해도 될 것 같다.

주어진 인자들을 순회하며 기능 개발 완료까지의 남은 일자를 구해 리스트에 넣고,
그 다음 반복문에서 대상(초기값은 리스트의 맨 처음 요소) 기능을 정하고 대상 기능이 다음 기능의 개발 완료 일자보다 클 경우 대상 기능이 배포되어야 다음 기능도 배포가 가능하므로 계속 카운트를 늘려주다가 그렇지 않은 경우가 나오면 해당 카운트(한번에 배포될 기능의 개수)를 정답 리스트에 넣어주고, 대상 기능을 변경(현재 반복문의 요소로 변경) 방식으로 풀이했다.

FuncDev.java

package com.example.Programmers.Lv2;

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

/**
 * 프로그래머스 Lv2 - 기능개발 문제
 * 분류: 스택/큐
 */
public class FuncDev {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        int len = progresses.length;
        List<Integer> list = new ArrayList<>();
        // 반복문을 통해서 개발 완료까지의 소요 일자를 구하여 리스트에 추가
        for (int i = 0; i < len; i++) {
            // 남은 진도율
            double needProgress = 100 - progresses[i];
            // 개발 속도
            double speed = speeds[i];
            // 올림을 통하여 개발 완료 소요 일자를 구함
            int needDay = (int) Math.ceil(needProgress / speed);
            list.add(needDay);
        }

        // 이전 개발완료 일자
        int before = list.get(0);
        // 하루에 몇 개의 기능을 배포할 수 있는지를 저장할 카운트 변수
        int cnt = 1;
        for (int i = 1; i < list.size(); i++) {
            // before의 기능 개발이 우선되어야 다음 기능들을 배포할 수 있는 경우
            if (before >= list.get(i)) {
                cnt++;
            } else { // before의 기능 개발이 완료 된 경우 그동안의 카운트한 총 배포할 기능 개수를 정답 리스트에 추가
                answer.add(cnt);
                cnt = 1;
                before = list.get(i);
            }
        }
        // 마지막 남은 배포 기능 갯수 추가
        answer.add(cnt);
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

FuncDevTest.java

package com.example.Programmers.Lv2;

import static org.junit.Assert.assertArrayEquals;

import org.junit.Test;

public class FuncDevTest {
    @Test
    public void testFuncDev() {
        FuncDev fd = new FuncDev();

        int[] result1 = fd.solution(new int[] { 93, 30, 55 }, new int[] { 1, 30, 5 });
        int[] result2 = fd.solution(new int[] { 95, 90, 99, 99, 80, 99 }, new int[] { 1, 1, 1, 1, 1, 1 });

        int[] expected1 = new int[] { 2, 1 };
        int[] expected2 = new int[] { 1, 3, 2 };

        assertArrayEquals(expected1, result1);
        assertArrayEquals(expected2, result2);
    }
}
profile
나의 개발로그

0개의 댓글