πŸ“ μ μ–΄μ„œ λ¨Έλ¦Ώμ†μœΌλ‘œ

[ν•˜μ½”ν…Œ] Day8. μ˜€λ²„ν—€λ“œ 쀄이기 (ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ "κΈ°λŠ₯κ°œμ„ " 풀이) λ³Έλ¬Έ

Programming/Algorithm

[ν•˜μ½”ν…Œ] Day8. μ˜€λ²„ν—€λ“œ 쀄이기 (ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ "κΈ°λŠ₯κ°œμ„ " 풀이)

Space_Jin 2025. 9. 21. 16:28
728x90
λ°˜μ‘ν˜•

ν•˜μ½”ν…Œ 8일차 문제 μ—­μ‹œ μŠ€νƒ/큐 λ¬Έμ œμž…λ‹ˆλ‹€.

ν•΄λ‹Ή λ¬Έμ œμ—μ„œλŠ” 큐λ₯Ό μ΄μš©ν•œ 문제 풀이λ₯Ό ν•˜μ˜€μœΌλ‚˜ λ°˜λ“œμ‹œ 자료ꡬ쑰 큐λ₯Ό μ΄μš©ν•  ν•„μš”μ—†μ΄ μ„±λŠ₯ ν–₯상을 μœ„ν•œ 방식을 κ³ λ €ν•΄λ³Ό 수 μžˆμ–΄μŠ΅λ‹ˆλ‹€.


문제 μ„€λͺ…

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

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

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

 

μ œν•œ 사항

μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.

μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

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

 

μž…μΆœλ ₯ 예

progresses speeds return

[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개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.


문제 풀이

ν•΄λ‹Ή λ¬Έμ œλŠ” μž‘μ—…μ˜ μˆœμ„œμ— λ”°λΌμ„œ λ°°ν¬κΉŒμ§€ 남은 μž‘μ—…κΈ°κ°„μ΄ μ•žμ„ μž‘μ—…κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ 계속 λΉ„κ΅ν•˜λŠ” 문제둜 FIFO(First In First Out)의 큐 자료ꡬ쑰λ₯Ό ν˜Ήμ€ 방법둠을 μ΄μš©ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

1. λ°°ν¬κΉŒμ§€ 남은 μž‘μ—… 기간을 κ³„μ‚°ν•˜μ—¬ 큐에 λ„£κΈ°

2. 배포할 μž‘μ—…λ³΄λ‹€ μž‘μ—… 기간이 μž‘κ±°λ‚˜ 같은 μž‘μ—…μ€ ν•¨κ»˜ 배포 -> νμ—μ„œ ν•¨κ»˜ 제거

λ°©μ‹μœΌλ‘œ μ ‘κ·Ό ν•©λ‹ˆλ‹€.

 

μ†ŒμŠ€ μ½”λ“œ

import java.util.Deque;
import java.util.ArrayDeque;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        /*
        문제 풀이 κ°œμš”
        ν•¨κ»˜ 배포될 μ„ΈνŠΈλ₯Ό μž‘μ—…μ˜ μˆœμ„œλŒ€λ‘œ 처리
        순차처리 -> 큐
        ν•¨κ»˜ 배포 -> ν˜„μž¬ 배포할 μž‘μ—…λ³΄λ‹€ μ™„λ£Œ μ˜ˆμ •κΈ°κ°„μ΄ μž‘κ±°λ‚˜ 같은 것
        */
        Deque<Integer> q = new ArrayDeque<>();  //μ™„λ£ŒκΉŒμ§€ 남은 μž‘μ—…μΌμ„ λ‹΄λŠ” 큐
        List<Integer> list = new ArrayList<>();    //정닡을 담을 리슀트
        
        //μž‘μ—… λ‹΄κΈ°
        for(int i = 0; i < progresses.length; i++) {
            //남은 μž‘μ—… κΈ°κ°„ -> μ†Œμˆ«μ μ€ ν•˜λ£¨κ°€ 더 ν•„μš”ν•˜λ―€λ‘œ 올림처리 ν•œλ‹€.
            int leftD = (int)Math.ceil((100.0 - progresses[i]) / speeds[i]); 
            q.offer(leftD);
        }
        
        //배포일 계산
        while(!q.isEmpty()) {
            int cnt = 1;    //ν•¨κ»˜ 배포될 μž‘μ—… 수
            int d = q.poll();   //ν˜„μž¬ μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€ κ±Έλ¦¬λŠ” κΈ°κ°„
            
            //ν•¨κ»˜ 배포될 μž‘μ—… 카운트
            while(!q.isEmpty() && q.peek() <= d) {
                q.poll();
                cnt++;
            }
            
            list.add(cnt);
        }
               
        return list.stream()
            .mapToInt(Integer::intValue)
            .toArray();
    }
}

 

ν•΄λ‹Ή μ½”λ“œλŠ” μ•žμ„  λ¬Έμ œν’€μ΄ 방식을 순차적으둜 μ½”λ“œλ‘œ κ΅¬ν˜„ν•œ μ½”λ“œμž…λ‹ˆλ‹€.

남은 μž‘μ—…μ„ κ³„μ‚°ν•˜μ—¬ 큐에 λ„£κΈ° -> 배포일이 같은 μž‘μ—…μ„ νμ—μ„œ 반볡적으둜 μ œκ±°ν•˜λ©΄μ„œ μ •λ‹΅ λ¦¬μŠ€νŠΈμ— 적재

μ‹œκ°„λ³΅μž‘λ„ O(logN)

 

ν•˜μ§€λ§Œ μœ„ 문제의 경우, μž‘μ—…(porgresses)λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ κ·ΈλŒ€λ‘œ 봐도 λ¬΄λ°©ν•˜λ―€λ‘œ 큐 자료ꡬ쑰의 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·Έ 밖에도 ArrayListλ₯Ό μ΄μš©ν•΄μ„œ 정닡을 μ‚½μž…, Stream을 ν†΅ν•œ μ •λ‹΅ νƒ€μž…(int λ°°μ—΄)둜 λ³€ν™˜ν•˜λ©΄μ„œ μ˜€λ²„ν—€λ“œ 등을 μ€„μ΄λŠ” 방식이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

κ°œμ„ λœ 풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {     
        /** κ°œμ„ λœ 풀이 */
        int n = progresses.length;
        // μž„μ‹œλ‘œ μ΅œλŒ€ nκ°œκΉŒμ§€ 담을 버퍼
        int[] tmp = new int[n];
        int k = 0; // μ‹€μ œ κ²°κ³Ό 길이

        // 첫 μž‘μ—…μ˜ μ™„λ£ŒμΌ(μ •μˆ˜ 올림)
        int curr = (100 - progresses[0] + speeds[0] - 1) / speeds[0];
        int cnt = 1;

        for (int i = 1; i < n; i++) {
            int day = (100 - progresses[i] + speeds[i] - 1) / speeds[i];
            if (day <= curr) {
                // ν˜„μž¬ 배포 λ¬ΆμŒμ— 포함
                cnt++;
            } else {
                // μ§€κΈˆκΉŒμ§€ 묢은 개수 ν™•μ •
                tmp[k++] = cnt;
                // μƒˆ κΈ°μ€€μΌλ‘œ κ°±μ‹ 
                curr = day;
                cnt = 1;
            }
        }
        // λ§ˆμ§€λ§‰ 묢음 μΆ”κ°€
        tmp[k++] = cnt;

        // κ²°κ³Ό 크기에 맞좰 μž˜λΌμ„œ λ°˜ν™˜
        return Arrays.copyOf(tmp, k);
    }
}

 

1. λΆˆν•„μš”ν•œ 큐에 λ‹΄κΈ° 제거

2. μ˜¬λ¦Όμ„ μœ„ν•œ ν˜•λ³€ν™˜μ„ 제거(float, Math λ“± μ‚¬μš© 제거)

3. 슀트림 μ˜€λ²„ν—€λ“œ 제거(Listλ₯Ό Array둜 λ³€ν™˜ν•˜κΈ° μœ„ν•¨)

 

을 ν†΅ν•΄μ„œ λ©”λͺ¨λ¦¬ μ‚¬μš© κ°μ†Œ 및 λ™μž‘ κ°„μ†Œν™”λ‘œ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 결과만 λ³΄μ•˜μ„ λ•Œ, μ‹œκ°„μ μœΌλ‘œ μ•½ 100λ°° 쒋은 μ„±λŠ₯을 λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.


λ‹¨μˆœνžˆ λ¬Έμ œκ°€ μš”κ΅¬ν•˜λŠ” μΉ΄ν…Œκ³ λ¦¬μ˜ 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν’€ 수 μžˆμ§€λ§Œ, κΈ°λ³Έν˜•(int λ°°μ—΄ λ“±)의 μ‚¬μš©μ΄λ‚˜ μ •μˆ˜ν˜• 올림 λ‚˜λˆ—μ…ˆμ„ μ΄μš©ν•œ μΊμŠ€νŒ… 제거, μŠ€νŠΈλ¦Όμ„ ν†΅ν•œ μ˜€λ²„ν—€λ“œ 제거 등을 적극적으둜 ν™œμš©ν•΄λ³΄λŠ” 것이 쒋은 μ„±λŠ₯의 μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆλ‹€λŠ”κ±Έ μ²΄κ°ν•˜κ²Œλœ 쒋은 λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•