프로그래머스 - 기능 개발 - Queue - Java

chaemin·2024년 5월 14일
0

프로그래머스

목록 보기
42/64

1. 문제

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

2. 풀이

문제를 처음에 보면 이해가 잘 안가고, 예시와 풀이를 함께 봐야 이해가 좀 더 잘가는 것 같다. 문제 이해를 정확히 해야 풀이를 잘 할 수 있다는 것을 명심하자.

Queue를 이용한 풀이. 처음부터 카운트 하려하지 말고 뒤에 큰 숫자가 나왔을때 이전까지의 카운트를 answer에 넣어주는 식으로 진행해야한다.

ex) 7 3 9

  • 처음에 7은 무조건 배포하지 못한다. (count = 1)
  • 3은 7보다 작으니 대기. (count = 2)
  • 9는 7보다 크니까 이전 count (count = 2)를 answer에 찍어주고, 다시 한계점을 9로 설정하고 count를 다시 시작한다.

✨핵심 Point

  1. Math.ceil
    해당 문제에서는 7 / 3 = 2.XXX인데 올림해서 3을 계산해줘야한다.
    정확한 올림 계산을 위해서는 double로 형을 변환해줘야한다.
int expiration = (int) Math.ceil((double)(100 - progresses[index]) / speeds[index]);
  1. ArrayList Integer to int배열
    나의 velog 기초 정리 참고
return answer.stream().mapToInt(Integer::intValue).toArray();
  1. day = expiration 을 해주는 시점이 처음 값으로 수정해줘야하기 때문에 if(expiration > day) 를 지나고 선언해줘야한다.
if(day != 0){ // 첫 완성은 배포할 수 없다.
    answer.add(count);
    //day = expiration;
    count = 0;
}
day = expiration;

3. [Queue]코드

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> answer = new ArrayList<>();
        Queue<Integer> q = new LinkedList<>();
        
        // 1. Queue에 집어넣기.
        for(int i = 0; i < progresses.length; i++){
            q.add(i);
        }
        
        int day = 0;
        int count = 0;
        
        while(!q.isEmpty()){
            int index = q.poll();
            int expiration = (int) Math.ceil((double)(100 - progresses[index]) / speeds[index]);
            
            if(expiration > day){
                if(day != 0){ // 첫 완성은 배포할 수 없다.
                    answer.add(count);
                    //day = expiration;
                    count = 0;
                }
                day = expiration;
            }
            count++;
        }
        answer.add(count);
        
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

3-2. 다른 코드

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        int n = progresses.length;
        
        int[] arr = new int[n];
        
        for(int i = 0; i < n; i++){
            int work = (100 - progresses[i]) / speeds[i];
            if( (100 - progresses[i]) % speeds[i] == 0 ){
                arr[i] = work;
            } else{
                arr[i] = work + 1;
            }
        }
        
        int befWork = arr[0];
        ArrayList<Integer> list = new ArrayList<>();
        int count = 1;
        
        for(int i = 1; i < n; i++){
            if(befWork < arr[i]){
                list.add(count);
                count = 1;
                befWork = arr[i];
            } else{
                count++;
            }
        }
        list.add(count);
        
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

0개의 댓글