πŸ”₯[99클럽 μ½”ν…Œ μŠ€ν„°λ””] 8일차 TIL - κΈ°λŠ₯ 개발

hoonssacΒ·2024λ…„ 7μ›” 29일

99Club

λͺ©λ‘ 보기
8/41
post-thumbnail

⏳문제

문제 μ„€λͺ…

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

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

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

μ œν•œ 사항

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

μž…μΆœλ ₯ 예

progressesspeedsreturn
[93, 30, 55][1, 30, 5}[2, 1]
[95, 90, 99, 99, 80, 99][1, 1, 1, 1, 1, 1][1, 3 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개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.


βœοΈν’€μ΄

λ‚˜λŠ” 인덱슀 λ³€μˆ˜λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ λ¬Έμ œμ— 접근을 ν•΄λ³΄μ•˜λ‹€.
ν˜„μž¬ 인덱슀 μš”μ†Œμ˜ 값이 100 이상이면, 즉, 진도가 100% 이상이라면, 진도가 100% μ•„λ‹Œ 값을 λ§Œλ‚  λ•ŒκΉŒμ§€, 인덱슀λ₯Ό μ¦κ°€μ‹œμΌœ μ£Όλ©΄μ„œ λ™μ‹œμ— 배포된 κΈ°λŠ₯의 개수λ₯Ό 1μ”© μ¦κ°€μ‹œμΌœμ£Όλ©΄ 될 것이라 μƒκ°ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

πŸ–₯οΈμ΅œμ’… μ½”λ“œ

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
        int releaseIndex = 0;
        ArrayList<Integer> answer = new ArrayList<>();
        
        while (releaseIndex < progresses.length) {
            for (int j = 0; j < progresses.length; j++) {
                progresses[j] += speeds[j];
            }
            int count = 0;
            while (releaseIndex < progresses.length && progresses[releaseIndex] >= 100) {
                releaseIndex++;
                count ++;
            }
            if (count > 0) {
                answer.add(count);
            }
        }
        return answer;
    }
}

μš°μ„  λ™μ‹œμ— 배보된 κΈ°λŠ₯의 개수λ₯Ό λ‹΄λŠ” ArrayList answerλ₯Ό μ„ μ–Έν•΄ μ£Όμ—ˆλ‹€.
progressesλ₯Ό 순차적으둜 νƒμƒ‰ν•˜κΈ° μœ„ν•΄ releaseIndex도 μ„ μ–Έν•΄ μ£Όμ—ˆκ³ , progresses의 길이만큼 μˆœνšŒν•˜λ„λ‘ λ°˜λ³΅λ¬Έμ„ λ§Œλ“€μ—ˆλ‹€.
일단, μž‘μ—…μ„ ν•œ 번 μ§„ν–‰μ‹œμΌœ μ£ΌκΈ° μœ„ν•΄ 각각의 진도에 각각의 speedλ₯Ό λ”ν•΄μ£Όμ—ˆλ‹€.

이제, λ§Œμ•½, releaseIndexκ°€ κ°€λ¦¬ν‚€λŠ” 진도가 100%라면,
그리고, κ·Έ 뒀에 진도가 100%인 μš”μ†Œκ°€ 더 μ‘΄μž¬ν•œλ‹€λ©΄,
κ·Έ 개수만큼 배포λ₯Ό μ‹œμΌœμ£Όμ–΄μ•Ό ν•œλ‹€.

이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν˜„μž¬ releaseIndexκ°€ κ°€λ¦¬ν‚€λŠ” 진도가 100% μ΄μƒμ΄λΌλŠ” 쑰건의 λ°˜λ³΅λ¬Έμ„ λ§Œλ“€μ–΄ releaseIndexκ°€ λ‹€μŒ 인덱슀둜 μ΄λ™ν•˜λ„λ‘ 1을 μ¦κ°€μ‹œμΌœ μ£Όμ—ˆκ³ , 배포된 κΈ°λŠ₯의 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” countλ³€μˆ˜μ—λ„ 1을 μ¦κ°€μ‹œμΌœ μ£Όμ—ˆλ‹€.

κ·Έλ ‡κ²Œ ν•œ λ²ˆμ— 배포된 κΈ°λŠ₯의 개수λ₯Ό answer에 μΆ”κ°€ν•΄μ€ŒμœΌλ‘œμ¨ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€!


πŸ˜²λ‹€λ₯Έ 풀이

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

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        // 각 κΈ°λŠ₯의 개발이 μ™„λ£Œλ˜λŠ” 데 ν•„μš”ν•œ λ‚  수λ₯Ό μ €μž₯ν•  리슀트
        List<Integer> days = new ArrayList<>();
        
        // 각 κΈ°λŠ₯λ³„λ‘œ 개발 μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” λ‚  수λ₯Ό 계산
        for (int i = 0; i < progresses.length; i++) {
            int progress = progresses[i];  // ν˜„μž¬ μž‘μ—…μ˜ 진도
            int speed = speeds[i];          // ν˜„μž¬ μž‘μ—…μ˜ 개발 속도
            // μž‘μ—… μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” λ‚  수 계산
            int daysToComplete = (int) Math.ceil((100 - progress) / speed);
            // λ¦¬μŠ€νŠΈμ— κ³„μ‚°λœ λ‚  수 μΆ”κ°€
            days.add(daysToComplete);
        }
        
        // 개발 μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” λ‚  수λ₯Ό 큐에 μ €μž₯
        Queue<Integer> queue = new LinkedList<>(days);
        // 각 배포일에 λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό μ €μž₯ν•  리슀트
        List<Integer> result = new ArrayList<>();
        
        // 큐가 빌 λ•ŒκΉŒμ§€ 반볡
        while (!queue.isEmpty()) {
            // ν˜„μž¬ μ²˜λ¦¬ν•  κΈ°λŠ₯의 개발 μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” λ‚  수
            int currentDay = queue.poll();
            int count = 1;  // ν˜„μž¬ κΈ°λŠ₯을 ν¬ν•¨ν•˜μ—¬ λ°°ν¬λ˜λŠ” κΈ°λŠ₯ 수 (μ΅œμ†Œ 1κ°œλŠ” 배포됨)
            
            // ν˜„μž¬ κΈ°λŠ₯이 배포될 날에 배포될 수 μžˆλŠ” 후속 κΈ°λŠ₯λ“€ 확인
            while (!queue.isEmpty() && queue.peek() <= currentDay) {
                queue.poll();  // 후속 κΈ°λŠ₯을 νμ—μ„œ 제거
                count++;       // λ°°ν¬λ˜λŠ” κΈ°λŠ₯ 수 증가
            }
            
            // λ°°ν¬λ˜λŠ” κΈ°λŠ₯의 수λ₯Ό κ²°κ³Ό λ¦¬μŠ€νŠΈμ— μΆ”κ°€
            result.add(count);
        }
        
        // κ²°κ³Ό 리슀트λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜
        return result.stream().mapToInt(i -> i).toArray();
    }
}

μš”κ±΄ 였늘 μ„Έμ…˜μ—μ„œ λ³Έ λ‹€λ₯Έ λΆ„μ˜ μ½”λ“œμ΄λ‹€

각 κΈ°λŠ₯λ³„λ‘œ 개발 μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” λ‚  수λ₯Ό λ¨Όμ € κ³„μ‚°ν•œ λ‹€μŒ,
큐λ₯Ό μ‚¬μš©ν•΄ ν˜„μž¬ κΈ°λŠ₯κ³Ό 후속 κΈ°λŠ₯의 배포 κ°€λŠ₯ μ—¬λΆ€λ₯Ό λ”°μ§€λ©΄μ„œ νμ—μ„œ μš”μ†Œλ“€μ„ ν•˜λ‚˜μ”© μ œκ±°ν•˜λ©° 숫자λ₯Ό 카운트 ν•΄μ£ΌλŠ” 방식이닀.

λ‚ μ§œλ₯Ό 미리 κ³„μ‚°ν•΄μ„œ ν‘ΈλŠ” 방법도 μžˆμ—ˆλ‹€λ‹ˆ..!
μ˜€λŠ˜λ„ ν•œ 수 배우고 κ°‘λ‹ˆλ‹€!πŸ’ͺ


πŸ”—λ¬Έμ œ 링크
πŸ’»Reposiroty

profile
ν›ˆμ‹Ήμ˜ κ°œλ°œμ—¬ν–‰

0개의 λŒ“κΈ€