본문 바로가기

Development

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

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer;
        int len = progresses.length;
        answer = new int[len];
        
        int index=0;
        int answer_idx = 0;
        int cnt=0;
                
        while(index<len){
            for(int i=0;i<len;i++){
                progresses[i]+=speeds[i];
            } 

            if(progresses[index]>=100){
            //만약, index의 작업이 완료가 되었다면
                for(int j=index;j<len;j++){
                    if(progresses[j]>=100) cnt++;
                    //해당 다음 작업도 완료시 확인하여 카운트한다.
                    else break;
                    //아니라면 반복문을 탈출한다.
                }
                index+=cnt;  
                //index를 cnt만큼 증가시켜서 완료된 작업은
                //더 이상, 비교하지 않는다.
                answer[answer_idx++]=cnt;
                cnt=0;
            }
        }
        
        for(int i=0;i<answer.length;i++){
            if(answer[i]==0){
                int[] arr = new int[i];
                System.arraycopy(answer, 0, arr, 0, i);
                answer = arr;
                break;
            }
        }
        //해당 for문은 위에서 answer의 크기를 progresses 배열의 길이로
        //고정시켜서, 이를 크기에 맞게 자르는 역할을 수행한다.
        
        return answer;
    }
}

요즘 학교에서 Java를 배우고 있어서 C++보다 익숙한 Java로 개발했습니다. 문제유형은 스택/큐로 분류되어 있지만, 굳이 사용을 안해도 될 꺼 같아서 단순 배열로 문제를 해결했습니다. progresses 배열에 각각의 speeds 만큼 계속 더합니다. 만약 0번째 index가 100 이상이 된다면 카운트를 하는데 이미 완료된 작업이 뒤에도 있을 경우에 그것까지 포함하여 카운트를 하게 작성했습니다.

이 코드의 아쉬운 점은, 마지막 for문에서 answer 배열의 크기를 조정하는 구문을 넣은 것이다. 처음에 answer를 정적으로 할당해서 넣은 값의 개수만큼 배열의 크기를 줄였는데, 찾아보니 ArrayList라는 자료구조가 있어서 이를 이용해서 코드를 또 작성했다.

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer;
        int len = progresses.length;
        ArrayList<Integer> myList = new ArrayList<>();
        
        int index=0;
        int answer_idx = 0;
        int cnt=0;
               
        while(index<len){
            for(int i=0;i<len;i++){
                progresses[i]+=speeds[i];
            }

            if(progresses[index]>=100){
                for(int j=index;j<len;j++){
                    if(progresses[j]>=100) cnt++;
                    else break;
                }
                index+=cnt;
                myList.add(cnt);
                cnt=0;
            }
        }
                
        answer = new int[myList.size()];
        for(int i=0;i<answer.length;i++)
            answer[i] = myList.get(i);
        return answer;
    }
}

모두 동일하지만, array 배열에 직접 저장하지 않고, ArrayList<Integer> myList에 배포되는 개수(cnt)를 저장하여 myList의 크기만큼 array 배열을 할당하여 리턴했습니다.

문제를 해결하고, 다른 분들의 소스코드를 봤는데 스택이나 큐를 이용하신 분은 그렇게 많지 않았고 작업이 완료될 날짜, 배포까지 남은 일수를 계산하여 문제를 푸신 분들도 있었습니다.