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

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[C++/PGS] Lv.2 : ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ (ํ)

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

๋ฌธ์ œ ์„ค๋ช…

ํŠธ๋Ÿญ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๊ฐ•์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์ผ์ฐจ์„  ๋‹ค๋ฆฌ๋ฅผ ์ •ํ•ด์ง„ ์ˆœ์œผ๋กœ ๊ฑด๋„ˆ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฆฌ์—๋Š” ํŠธ๋Ÿญ์ด ์ตœ๋Œ€ bridge_length๋Œ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฆฌ๋Š” weight ์ดํ•˜๊นŒ์ง€์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ๋‹ค๋ฆฌ์— ์™„์ „ํžˆ ์˜ค๋ฅด์ง€ ์•Š์€ ํŠธ๋Ÿญ์˜ ๋ฌด๊ฒŒ๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ๋Ÿญ 2๋Œ€๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๊ณ  ๋ฌด๊ฒŒ๋ฅผ 10kg๊นŒ์ง€ ๊ฒฌ๋””๋Š” ๋‹ค๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ [7, 4, 5, 6]kg์ธ ํŠธ๋Ÿญ์ด ์ˆœ์„œ๋Œ€๋กœ ์ตœ๋‹จ ์‹œ๊ฐ„ ์•ˆ์— ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑด๋„ˆ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฝ๊ณผ ์‹œ๊ฐ„๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚œ ํŠธ๋Ÿญ / ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋Š” ํŠธ๋Ÿญ / ๋Œ€๊ธฐ ํŠธ๋Ÿญ
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

๋”ฐ๋ผ์„œ, ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋ ค๋ฉด ์ตœ์†Œ 8์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

solution ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ค๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋Ÿญ ์ˆ˜ bridge_length, ๋‹ค๋ฆฌ๊ฐ€ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ weight, ํŠธ๋Ÿญ ๋ณ„ ๋ฌด๊ฒŒ truck_weights๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


 

์„ ์ž…์„ ์ถœ์ด๋ฏ€๋กœ ํ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฑด ์‰ฌ์› ์œผ๋‚˜,

์–ธ์ œ ๋„ฃ๊ณ  ์–ธ์ œ ๋นผ์•ผํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ฌธ์ œ.

 

์ฐธ๊ณ ๋กœ ์ด ๋ฌธ์ œ์—์„œ bridge_length๋Š” ํŠธ๋Ÿญ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ด์ž ๋‹ค๋ฆฌ์˜ ๊ธธ์ด(ํŠธ๋Ÿญ์€ 1์ดˆ์— 1๋งŒํผ ์ „์ง„)์ด๋‹ค.

 

while ๋ฌธ ์•ˆ์—์„œ idx ์นด์šดํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋งˆ์ง€๋ง‰ ํŠธ๋Ÿญ์ด ์ง„์ž…ํ–ˆ๋‹ค๋Š” ๋ง์ด๋ฏ€๋กœ answer์— ๋‹ค๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ๋”ํ•ด์ฃผ๊ณ  breakํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค๋ฆฌ ์‚ฌ์ด์ฆˆ์™€ ๊ฐ™์•„์ง€๋ฉด ๋ฌด๊ฒŒ ํ•ฉ๊ณ„์ธ sum์—์„œ q.front๋ฅผ ๋นผ์ฃผ๊ณ  popํ•ด์ค€๋‹ค.

ํ˜„์žฌ "๋‹ค๋ฆฌ ์œ„์˜ ๋ฌด๊ฒŒ ํ•ฉ๊ณ„+๋‹ค์Œ ํŠธ๋Ÿญ์˜ ๋ฌด๊ฒŒ"๊ฐ€ weight๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ํŠธ๋Ÿญ์„ ์˜ฌ๋ฆฌ๊ณ ,

ํฌ๋‹ค๋ฉด 0์„ ํ์— ๋„ฃ์–ด์„œ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๊ณ  ํŠธ๋Ÿญ์„ ์•ž์œผ๋กœ ๋ฐ€์–ด์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ๋ฆ„์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Œ

 

1์ดˆ : 7 <- queue size = 1, 7+4 > weight์ด๋ฏ€๋กœ 0 push

2์ดˆ : 7 0  <- queue size = 2, 7 pop, 0+4 <= weight

3์ดˆ : 0 4 <- queue size = 2, 0 pop, 4+5 <= weight

4์ดˆ : 4 5 <- ...

 

 

๋‚˜์˜ ํ’€์ด

#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    queue<int> q;
    int sum=0;
    int idx=0;
    while(1){
        if(idx==truck_weights.size()){ // ๋งˆ์ง€๋ง‰ ํŠธ๋Ÿญ
            answer+=bridge_length;
            break;
        }
        answer++;
        int now = truck_weights[idx];
        if(q.size()==bridge_length){
            sum -= q.front();
            q.pop();
        }
        if(sum + now <= weight){
            sum += now;
            q.push(now);
            idx++;
        }else{
            q.push(0); // ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ 0์ด ํฌํ•จ๋จ
        }
    }
    return answer;
}