λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Programmers

[1μ£Όμ°¨] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ κΈ°λŠ₯개발

κΈ°λŠ₯개발 문제 풀이

πŸ’» Q

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.


λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

πŸ’‍♀️ μ œν•œ 사항
• μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
• μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
• μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
• λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€.
• 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

μž…μΆœλ ₯ 예
# 1
첫 번째 κΈ°λŠ₯은 93% μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 1%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 7일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
두 번째 κΈ°λŠ₯은 30%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 30%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 3일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ 이전 첫 번째 κΈ°λŠ₯이 아직 μ™„μ„±λœ μƒνƒœκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 첫 번째 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ” 7일째 λ°°ν¬λ©λ‹ˆλ‹€.
μ„Έ 번째 κΈ°λŠ₯은 55%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 5%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 9일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 7일째에 2개의 κΈ°λŠ₯, 9일째에 1개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.

# 2
λͺ¨λ“  κΈ°λŠ₯이 ν•˜λ£¨μ— 1%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ, μž‘μ—…μ΄ λλ‚˜κΈ°κΉŒμ§€ 남은 μΌμˆ˜λŠ” 각각 5일, 10일, 1일, 1일, 20일, 1μΌμž…λ‹ˆλ‹€.
μ–΄λ–€ κΈ°λŠ₯이 λ¨Όμ € μ™„μ„±λ˜μ—ˆλ”λΌλ„ μ•žμ— μžˆλŠ” λͺ¨λ“  κΈ°λŠ₯이 μ™„μ„±λ˜μ§€ μ•ŠμœΌλ©΄ 배포가 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 5일째에 1개의 κΈ°λŠ₯, 10일째에 3개의 κΈ°λŠ₯, 20일째에 2개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.

 

πŸ’‘ A

κ°€μž₯ μ•žμ— μžˆλŠ” κΈ°λŠ₯이 μ™„λ£Œ 되기 μ „κΉŒμ§€ 뒀에 κΈ°λŠ₯이 λ°°ν¬λ˜μ§€ λͺ»ν•œλ‹€λŠ” 쑰건을 μƒκ°ν–ˆμ„λ•Œ FIFO ꡬ쑰인 큐λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ 적합해 λ³΄μ˜€λ‹€.
ν•˜μ§€λ§Œ μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  것인지 생각보닀 μ–΄λ €μ› λ‹€.
μ§„ν–‰λ₯ κ³Ό 진행속도λ₯Ό λ”°λ‘œ μ €μž₯ν•΄μ£Όκ³  배포일 수λ₯Ό 담을 λ°°μ—΄ 리슀트λ₯Ό λ§Œλ“  ν›„ μ§„ν–‰λ₯ κ³Ό 진행속도λ₯Ό 더해 100을 λ„˜μœΌλ©΄ 배포 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” countλ₯Ό 늘렀주고 κ°€μž₯ μ•ž 데이터λ₯Ό κΊΌλ‚Έλ‹€.
100이 λ„˜μ§€ μ•Šμ„ 경우 λ‚ μ§œ 수λ₯Ό 늘렀 μ£Όκ³  λ°°ν¬λ˜λŠ” λ‚ μ§œμ˜ κΈ°λŠ₯ 수λ₯Ό λ°˜ν™˜ ν•œλ‹€.

import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayList;

class Solution { 
    public int[] solution(int[] progresses, int[] speeds) {

        int[] answer = {}; 

        ArrayList<Integer> days = new ArrayList<>(); 
        Queue<Integer> prog = new LinkedList<>(); 
        Queue<Integer> sp = new LinkedList<>(); 

        for(int i=0;i<progresses.length;i++) 
            prog.add(progresses[i]); 
        for(int i=0;i<speeds.length;i++) 
            sp.add(speeds[i]); 
        int day = 1; 
        while(!prog.isEmpty()){ 
            int count = 0; 
            while(prog.peek() + (sp.peek() * day) < 100) 
                day++; 
            while (!prog.isEmpty() && prog.peek() + (sp.peek() * day) >= 100){ 
                prog.remove(); 
                sp.remove(); 
                count++; 
            } 
            if(count > 0) days.add(count); 
        } 
        answer = new int[days.size()]; 
        for(int i = 0; i < days.size(); i++) answer[i] = days.get(i); 
        return answer; 
    } 
}