뭐요

[프로그래머스] 기능 개발 (JAVA) 본문

Problem Solving

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

욕심만 많은 사람 2023. 6. 3. 16:18

first-try

오로지 idx를 활용해서 빡구현으로 가볍게 문제 풀었음.

import java.util.*;

class Solution {
    List<Integer> answerList = new ArrayList<>();
    
    public int[] solution(int[] progresses, int[] speeds) {
        int idx = 0;
        
        while(idx < progresses.length){
            if(progresses[idx] >= 100){
                int deployment = 0;
                for(int i = idx; i < progresses.length; i++){
                    if(progresses[i] < 100)
                        break;
                    deployment++;
                    idx++;
                }
                answerList.add(deployment);
                continue;
            }

            for(int i = idx ; i < progresses.length; i++){
                progresses[i] += speeds[i];
            }
        }
        
        return getAnswer();
    }
    
    private int[] getAnswer(){
        int[] answer = new int[answerList.size()];
        for(int i = 0 ; i < answer.length; i++){
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
}

인덱스만을 통해서 문제를 풀면 시간복잡도 및 공간복잡도에서 더 효율적일진 몰라도, 신뢰성이 비교적 떨어짐.

코테에서 긴장하다보면 안풀려서 멘탈 흔들릴 수 있으므로 Queue를 이용해서도 풀어볼 필요성을 느낌.

second-try

import java.util.*;

class Solution {
    List<Integer> answerList = new ArrayList<>();
    Queue<Integer> progressQueue = new LinkedList<>();
    Queue<Integer> speedQueue = new LinkedList<>();
    
    public int[] solution(int[] progresses, int[] speeds) {
        init(progresses, speeds);
        
        while(!progressQueue.isEmpty()){
            if(progressQueue.peek() >= 100){
                int count = 0;
                int size = progressQueue.size();
                for(int i = 0 ; i < size; i++){
                    if(progressQueue.peek() < 100)
                        break;
                    progressQueue.poll();
                    speedQueue.poll();
                    count++;
                }
                System.out.println();
                
                answerList.add(count);
                continue;
            }
            
            work();
        }
        
        return getAnswer();
    }
    
    private void init(int[] progresses, int[] speeds){
        for(int progress : progresses){
            progressQueue.add(progress);
        }
        for(int speed : speeds){
            speedQueue.add(speed);
        }
    }
    
    private int[] getAnswer(){
        int[] answer = new int[answerList.size()];
        for(int i = 0 ; i < answer.length; i++){
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
    
    private void work(){
        for(int i = 0 ; i < progressQueue.size(); i++){
            int num = progressQueue.poll();
            int speed = speedQueue.poll();
            progressQueue.add(num + speed);
            speedQueue.add(speed);
        }
    }
}

refactoring version!

import java.util.*;

class Solution {
    List<Integer> answerList = new ArrayList<>();
    Queue<Integer> progressQueue = new LinkedList<>();
    Queue<Integer> speedQueue = new LinkedList<>();
    
    public int[] solution(int[] progresses, int[] speeds) {
        init(progresses, speeds);
        
        while(!progressQueue.isEmpty()){
            if(progressQueue.peek() >= 100){
                int deployment = 0;
                int size = progressQueue.size();
                
                for(int i = 0 ; i < size; i++){
                    if(progressQueue.peek() < 100)
                        break;
                    poll();
                    deployment++;
                }
                
                answerList.add(deployment);
                continue;
            }
            
            workOneDay();
        }
        
        return getAnswer();
    }
    
    private void init(int[] progresses, int[] speeds){
        for(int progress : progresses){
            progressQueue.add(progress);
        }
        for(int speed : speeds){
            speedQueue.add(speed);
        }
    }
    
    private int[] getAnswer(){
        int[] answer = new int[answerList.size()];
        for(int i = 0 ; i < answer.length; i++){
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
    
    private void workOneDay(){
        for(int i = 0 ; i < progressQueue.size(); i++){
            int num = progressQueue.poll();
            int speed = speedQueue.poll();
            progressQueue.add(num + speed);
            speedQueue.add(speed);
        }
    }
    
    private void poll(){
        progressQueue.poll();
        speedQueue.poll();        
    }
}