본문 바로가기

컴퓨터/프로그래머스

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

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public List <Integer> solution(int[] progresses, int[] speeds) {
        List <Integer> answer = new ArrayList<>();
        while(progresses.length > 0) {
            for(int i = 0; i < progresses.length; i++)
                progresses[i] += speeds[i];
            
            int cnt = 0;
            while(progresses.length > 0 && progresses[0] >= 100) {
                cnt++;
                progresses = Arrays.copyOfRange(progresses, 1, progresses.length);
                speeds = Arrays.copyOfRange(speeds, 1, speeds.length);
            }
            if(cnt > 0)
                answer.add(cnt);
        }
        return answer;
    }
}

2. 설명

문제에서 스택 혹은 큐를 이용하여 해결하는 것을 의도한 것 같지만 배열을 이용하여 해결하는 것이 더 간단해 보여 배열을 이용한 풀어보았다.

while(progresses.length > 0) {
    for(int i = 0; i < progresses.length; i++)
        progresses[i] += speeds[i];

progresses의 길이가 1 이상일 때 즉 progresses가 존재한다면 계속 반복합니다. 그리고 각각의 progresses에 맞는 speeds를 더해줍니다.

    int cnt = 0;
    while(progresses.length > 0 && progresses[0] >= 100) {
        cnt++;
        progresses = Arrays.copyOfRange(progresses, 1, progresses.length);
        speeds = Arrays.copyOfRange(speeds, 1, speeds.length);
    }
    if(cnt > 0)
        answer.add(cnt);

progresses의 길이가 1 이상이고 progresses 첫 번째 요소가 100 이상일 때 반복해 줍니다. 반복할 때마다 cnt의 값을 1 증가시키고 progresses와 speeds의 첫 번째 요소를 제거합니다. 따라서 cnt는 배포된 기능의 수이며 0 이상일 경우 answer에 추가해 주며 answer를 반환하면 문제는 해결됩니다.

3. 정리

  1. 배열을 이용해 쉽게 해결 가능
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges