๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2] ๊ธฐ๋Šฅ๊ฐœ๋ฐœ (Queue, ํ)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2. ๊ธฐ๋Šฅ๊ฐœ๋ฐœ

๋ฌธ์ œ ์„ค๋ช…

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํŒ€์—์„œ๋Š” ๊ธฐ๋Šฅ ๊ฐœ์„  ์ž‘์—…์„ ์ˆ˜ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ธฐ๋Šฅ์€ ์ง„๋„๊ฐ€ 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]

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

๋‹จ์ˆœ ๋ฐ˜๋ณต๋ฌธ์— ํ๋ฅผ ์กฐ๊ธˆ ์‚ฌ์šฉํ•˜๋ฉด ๊ธˆ๋ฐฉ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

ํ์— progress์™€ speed ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ง„ํ–‰๋ฅ ์ด ์™„๋ฃŒ๋˜๋ฉด ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐํฌ๋œ ์ž‘์—…์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ answer ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

progress์™€ speed ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค.

static class Work {
    int progress;
    int speed;
        
    Work(int progress, int speed) {
        this.progress = progress;
        this.speed = speed;
    }
        
    public int getTotalProgress(int day) { // ํŠน์ • ์ผ ์ˆ˜(day)๊ฐ€ ์ง€๋‚œ ํ›„ ์ง„ํ–‰๋ฅ 
        return this.progress + this.speed * day;
    }
}

์ง„ํ–‰๋ฅ ์ธ progress์™€ ๊ฐœ๋ฐœ ์†๋„์ธ speed ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๊ณ ,

getTotalProgress ๋ฉ”์†Œ๋“œ์—์„œ ํŠน์ • ์ผ ์ˆ˜(day)๊ฐ€ ์ง€๋‚œ ํ›„์˜ ์ง„ํ–‰๋ฅ ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

progresses์™€ speeds์˜ ์ •๋ณด๋ฅผ ํ์— ์ €์žฅํ•œ๋‹ค.

Queue<Work> queue = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
    queue.add(new Work(progresses[i], speeds[i]));
}

 

์ด์ œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ž‘์—… ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•œ๋‹ค.

List<Integer> al = new ArrayList<>(); // ๊ฐ ๋ฐฐํฌ์˜ ์ž‘์—… ๊ฐœ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ
int day = 0, count = 0; // day: ์ง€๋‚œ ์ผ ์ˆ˜, count: ๋ฐฐํฌ ๋Œ€๊ธฐ ์ž‘์—… ๊ฐœ์ˆ˜
        
while (!queue.isEmpty()) {
    Work work = queue.peek(); // ๋‚จ์€ ์ž‘์—… ์ค‘ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ž‘์—…
            
    if (work.getTotalProgress(day) >= 100) { // ์ง„ํ–‰ ์™„๋ฃŒ(๋ฐฐํฌ)
        queue.poll();
        count++; // ๋ฐฐํฌ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
    } else { // ์ง„ํ–‰ ์ค‘
        if (count > 0) { // ๋ฐฐํฌ ์ž‘์—…์ด ์žˆ์œผ๋ฉด ๋ฐ˜์˜ ํ›„ ์ดˆ๊ธฐํ™”
            al.add(count);
            count = 0;
        }
        day++; // ์ผ ์ˆ˜ ์ฆ๊ฐ€
    }
}
        
if (count > 0) al.add(count); // ๋ฐฐํฌ๋œ ์ž‘์—…์ด ์žˆ์œผ๋ฉด ๋งˆ์ง€๋ง‰ ๋ฐ˜์˜

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—… ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐํฌ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ํ์—์„œ ๊บผ๋‚ด๊ณ  ๋ฐฐํฌ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๋ฐฐํฌ ์ „์ด๋ผ๋ฉด, ๋ฐฐํฌ ํ•œ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด(count > 0) ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋ฐ˜์˜ํ•ด์ฃผ๊ณ  ๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ํ›„, ๋ฐฐํฌํ•œ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋ฐ˜์˜ํ•ด์ค€๋‹ค.

 

์œ„ ํ’€์ด ๋ฐฉ์‹์„ ์ „์ฒด ์ฝ”๋“œ๋กœ ํ’€์–ด๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import java.util.*;

class Solution {
    
    static class Work {
        int progress;
        int speed;
        
        Work(int progress, int speed) {
            this.progress = progress;
            this.speed = speed;
        }
        
        public int getTotalProgress(int day) {
            return this.progress + this.speed * day;
        }
    }
    
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Work> queue = new LinkedList<>();
        for (int i = 0; i < progresses.length; i++) {
            queue.add(new Work(progresses[i], speeds[i]));
        }
        
        List<Integer> al = new ArrayList<>();
        int day = 0, count = 0;
        
        while (!queue.isEmpty()) {
            Work work = queue.peek();
            
            if (work.getTotalProgress(day) >= 100) { // ์ง„ํ–‰ ์™„๋ฃŒ
                queue.poll();
                count++;
            } else { // ์ง„ํ–‰ ์ค‘
                if (count > 0) { // ๋ฐฐํฌ ์ž‘์—…์ด ์žˆ์œผ๋ฉด ๋ฐ˜์˜ ํ›„ ์ดˆ๊ธฐํ™”
                    al.add(count);
                    count = 0;
                }
                day++;
            }
        }
        
        if (count > 0) al.add(count);
        
        int[] answer = new int[al.size()];
        for (int i = 0; i < al.size(); i++) {
            answer[i] = al.get(i);
        }
        
        return answer;
    }
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ๋ฌธ์ œ๋„ ์กฐ๊ฑด์™€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๋งŒ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ •๋ฆฌํ•˜๋ฉด ๊ธˆ๋ฐฉ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ œํ•œ๋œ ์‹œ๊ฐ„์ด ์žˆ์œผ๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์— ์ต์ˆ™ํ•ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
LIST