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

Coding Test/Programmers

[JAVA] μŠ€νƒ/큐 Lv.2 / κΈ°λŠ₯개발

πŸ”—λ§ν¬

programmers.co.kr/learn/courses/30/lessons/42586?language=java

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - κΈ°λŠ₯개발

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ”

programmers.co.kr

 

πŸ“œλ¬Έμ œ

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

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

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

 

πŸ””μ œν•œ 사항

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

 

πŸ“ν’€μ΄ κ³Όμ •

 - Queue문제  
    Queue의 μ„±μ§ˆμΈ FIFOλ₯Ό ν™œμš©ν•˜μ—¬ ν’€μ΄ν•˜λŠ” 문제

//1 
 κ° μž‘μ—…μ— κ±Έλ¦¬λŠ” μ‹œκ°„ = ((100 - progresses) % speeds)
     - "λ‚˜λ¨Έμ§€κ°€ μƒκΈ°λŠ” 경우" 와 "λ‚˜λ¨Έμ§€κ°€ 생기지 μ•ŠλŠ” 경우" 두가지 경우둜 λ‚˜λˆ„μ–΄μ€€λ‹€ (μ‚Όν•­ μ—°μ‚°μž μ‚¬μš©)

          - λ‚˜λ¨Έμ§€κ°€ μƒκΈΈκ²½μš° : κ±Έλ¦¬λŠ” μ‹œκ°„ = λͺ« + 1
          -λ‚˜λ¨Έμ§€κ°€ 생기지 μ•ŠλŠ” 경우:  κ±Έλ¦¬λŠ” μ‹œκ°„ = λͺ«

   μž‘μ—…λ§ˆλ‹€ κ±Έλ¦° μ‹œκ°„μ„ 큐에 순차적으둜 λ„£μ–΄μ€€λ‹€

//2
이전 μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ”λ™μ•ˆ μ™„λ£Œλœ μž‘μ—…μ˜ 갯수λ₯Ό 넣어쀄 ArrayList λ³€μˆ˜ answerList μ„ μ–Έ
 νμ—μ„œ pollν•˜μ—¬ 첫번째 μž‘μ—…μ˜ κ±Έλ¦°μ‹œκ°„μ„ λΉΌμ£Όκ³  첫번째 μž‘μ—…κ³Ό 이후 μž‘μ—…λ“€μ„ λΉ„κ΅ν•˜κΈ° μœ„ν•΄ prevDay λ³€μˆ˜μ— 첫번째 μž‘μ—…μ˜ κ±Έλ¦°μ‹œκ°„μ„ λ„£μ–΄μ€€λ‹€
μ™„λ£Œλœ μž‘μ—…μ˜ μˆ˜λŠ” = 1


큐가 λΉŒλ•ŒκΉŒμ§€ μ‹€ν–‰
  curDays λ³€μˆ˜μ— νμ—μ„œ pollν•œ 값을 λ„£κ³ 
   
    - prevDay >= curDays 일경우 (이전 μž‘μ—… κ±Έλ¦°μ‹œκ°„ >= 이후 μž‘μ—… κ±Έλ¦°μ‹œκ°„)
        μ™„λ£Œλœ μž‘μ—…μ˜ 수 증가

     -  κ·Έ μ™Έμ˜ 경우
      answerList에 μ΄μ œκΉŒμ§€ μ™„λ£Œλœ μž‘μ—…μ˜ 수 λ„£μ–΄μ€Œ ,  prevDay = curDays둜 λ°”κΎΈκ³  μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό ν•œκ°œλ‘œ λ°”κΏ”μ€€λ‹€

while문이 λλ‚˜λ©΄ answerList에 μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό λ„£μ–΄μ€Œ

//3
이후 μ •λ‹΅ 좜λ ₯을 μœ„ν•΄ answerList의 값을 ν•˜λ‚˜μ”© answer 배열에 λ„£μ–΄μ€€λ‹€.

πŸ’»μ½”λ“œ

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        Queue<Integer> q = new LinkedList<>();
        
        //1
        for(int i= 0; i<progresses.length; i++)
        {
            //남은 μž‘μ—… μΌμˆ˜κ°€ μ§„ν–‰μ†λ„λ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λ©΄ λͺ«μ„ λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€μ§€ μ•ŠμœΌλ©΄ +1
            q.add(
                (100-progresses[i])%speeds[i] == 0?
                (100-progresses[i])/speeds[i] :
                (100-progresses[i])/speeds[i] +1
            );
        }
        
        //2
        ArrayList<Integer> answerList = new ArrayList<>();
        int prevDay = q.poll();
        int numOfDone = 1;
        while(!q.isEmpty())
        {
            int curDays = q.poll();
            if(prevDay >= curDays)
            {
                numOfDone++;
            }else{
                answerList.add(numOfDone);
                numOfDone = 1;
                prevDay = curDays;
            }
        }
        answerList.add(numOfDone);
        
        //3
        int[] answer = new int[answerList.size()]; 
        for(int i= 0; i<answerList.size(); i++)
        {
            answer[i]=answerList.get(i);
        }
        return answer;
    }
}