[프로그래머스] 기능개발 (Lv.2, Java)

양현승·2023년 8월 30일

알고리즘

목록 보기
6/9

💡 문제

문제설명

🤔 고민사항

  • 난 아직 프로그래머스 Lv.2도 어려운것 같다. 요구사항을 어떻게 구현해야할지 처음에 막막했다.
  • '입출력 예 설명 #2' 중

모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.

  • 에서 힌트를 얻었다. 다시 말하면 이 구문이 없었다면 굉장히 헤맸을 문제였다.
  • 눈치빠른 사람들은 알아챘겠지만, '각각 5일, 10일, 1일, 1일, 20일, 1일입니다.' 문장에서 Queue가 떠올랐을 것이다. 즉, 입력받은 두 배열을 통해 남은일수를 계산해서 순차적으로 Queue에 담아놓으면 쉽게 풀리는 문제이다.
  • 다시! (5, 10, 1, 1, 20, 1) 큐에서 처음 뽑은 토큰보다 낮은 숫자가 나오면 다음 배포까지 보류, 높은 숫자가 나오면 바로 배포하는 식으로 계산하면 되는것이다.
    사실 직관적으로 패턴을 파악해서 풀었다. 첫번째 기능은 5일 걸리고 두번째 기능은 10일이 걸리면 첫번째 기능만 우선 배포하고 두번째 날까지 기다리면 된다. 두번째 기능은 10일, 세번째와 네번째가 1일, 다섯 번째가 20일이 걸린다면 두번째, 세번째, 네번째 기능을 배포하고 다섯번째 기능까지 기다리는 것이다.
  • 나 같은 경우 ArrayList를 활용해서 큐에서 더 큰 숫자(배포까지 걸리는 일수)가 나올 때까지 센 카운트(기능 갯수)를 순서대로 담았고,
    ArrayList를 정답배열로 복사하여 반환하였다.

👨‍💻 CODE

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        Queue<Integer> queue = new LinkedList<Integer>();
        ArrayList<Integer> ans = new ArrayList<Integer>();
        
        for(int i=0; i<progresses.length; i++){
            int progress = progresses[i];
            int speed = speeds[i];
            int dateUntilDeploy = calculDate(progress, speed);
            queue.add(dateUntilDeploy);
        }
        
        int pivot = queue.poll();
        int cnt = 1;
        while(!queue.isEmpty()){
            int num = queue.poll();
            if(pivot >= num){
                cnt++;
            }
            else{
                ans.add(cnt);
                pivot = num;
                cnt = 1;
            }
        }
        ans.add(cnt);
        
        answer = new int[ans.size()];
        for(int i=0; i<ans.size(); i++)
            answer[i] = ans.get(i);
        
        return answer;
    }
    
    public int calculDate(int p, int s){
        return (100 - p) % s == 0 ? (100 - p) / s : (100 - p) / s + 1;
    }
}

⚒️ 리뷰

아직 코드를 작성하는 요령이 부족한 것 같다.
문제를 해결하는 논리과정을 생각하는데 집중하느라 클린코드나 코드 표현력에 신경쓸 여유가 없다.
동일한 기능을 수행하더라도 가독성이 좋고 이해가 잘 가는 코드를 작성하고 싶다.

profile
기록의 필요성을 느끼고 시작한 곳입니다. 혼잣말 하는것 같아 재밌네요!

0개의 댓글