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

JOY·2023년 8월 22일
0

[CodingTest] Java

목록 보기
60/61

🫡 문제

프로그래머스 - 기능개발

🫡 코드

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> que = new LinkedList<>();
        
        //배포 가능까지 필요한 작업 기간
        int[] days = new int[progresses.length];
        
        //배포 기간 저장
        for(int i=0; i<progresses.length; i++){           
           if(((100-progresses[i]) % speeds[i]) == 0){
                days[i] = (100-progresses[i]) / speeds[i];
                que.add(days[i]);
           }else{
                days[i] = (100-progresses[i]) / speeds[i];
                que.add(days[i]+1);               
           }
        }
        
        // 결과값 저장
        List<Integer> resultList = new ArrayList<>(); 
        
        int result = 1;     //첫번째 작업은 가장 먼저 배포가 됨
        
        while(!que.isEmpty()){
            int x = que.poll(); //첫번째 작업 소요 기간
            
            while(!que.isEmpty() && x >= que.peek()){ //다음 작업이 존재하고 함께 배포가 가능할 경우
                result++;
                que.poll(); //같이 배포 해서 삭제
            }
            
            resultList.add(result); //결과값 저장
            result = 1; //다음 배포를 위해 다시 1로 초기화
            
        }        
        
        int[] answer = new int[resultList.size()];
        for(int i=0; i<resultList.size(); i++){
            answer[i] = resultList.get(i);
        }
        
        return answer;
    }
}

🫡 풀이

Queue를 이용한 풀이

해당 문제는 선입선출이 이루어져야 하기 때문에 Queue를 사용해서 문제를 풀이했다.

  • 각 기능의 개발 속도는 다르다.
  • 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발이 된다면,
    뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포된다.
  • 진도가 100% 일 경우에만 배포가 가능하다.

☝️[배포 기간 저장] 부분의 실패 풀이

100 - 각 기능의 현재 작업 진도 를 계산 해준 값에 각 기능의 작업속도나눈 값을 저장해주었는데 테스트 11번에서 실패를 했음..

for(int i=0; i<progresses.length; i++){
        days[i] = (100-progresses[i]) / speeds[i];
        que.add(days[i]);
}

주어진 입출력 예에서는 모두 나눈 값이 0으로 떨어졌기 때문에
배포 기간이 하루씩 체크가 되는데
0으로 나누어 떨어지지 않는 경우가 있는 경우를 생각하지 못했다.
(ex. 7/3 = 2, 나머지는 1이기 때문에 하루가 더 소요된다)

100 - 각 기능의 현재 작업 진도 를 계산 해준 값에 각 기능의 작업속도를 나눈 값

  1. 나누어 떨어지는 경우
    100-93 = 7/1 = 7 → 7일 소요
    100-30 = 90/30 = 3 → 3일 소요
    100-55 = 45/5 = 9 → 9일 소요

  2. 나누어 떨어지지 않는 경우(예시)
    100-93 = 7/2 = 3 → 3+1일 소요
    100-30 = 90/40 = 2 → 2+1일 소요
    100-55 = 45/7 = 6 → 6+1일 소요


✌️[배포 기간 저장] 부분의 성공 풀이

위의 문제를 개선하기 위해 아래 코드로 변경했다.

100 - 각 기능의 현재 작업 진도 를 계산 해준 값에 각 기능의 작업속도를 나눈 값이 0일 경우와 0이 아닐 경우 작업 기간이 하루 더 필요하기 때문에 +1

//배포 기간 저장
        for(int i=0; i<progresses.length; i++){           
           if(((100-progresses[i]) % speeds[i]) == 0){
                days[i] = (100-progresses[i]) / speeds[i];
                que.add(days[i]);
           }else{
                days[i] = (100-progresses[i]) / speeds[i];
                que.add(days[i]+1);               
           }
        }

굳이 days 배열에 저장하지 않고 바로 큐에 값을 넣어줘도 상관 없다 ㅎ

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글

관련 채용 정보