๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๊ธˆ๊ณผ ์€ ์šด๋ฐ˜ํ•˜๊ธฐ

by Jaeguk 2022. 7. 11.
๋ฌธ์ œ ๋งํฌ

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

 

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

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

programmers.co.kr

์ƒˆ๋กœ์šด ๋„์‹œ๋ฅผ ์ง“๊ธฐ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋‚˜๋ผ์—์„œ ๊ธˆ๊ณผ ์€์„ ์šด์†กํ•œ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ ๊ธˆ๊ณผ ์€์„ ๋ชจ๋‘ ์šด์†กํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž.

 

ํ’€์ด

 ๊ฐ ๋„์‹œ๋งˆ๋‹ค ์ž์›์˜ ์–‘์ด ํ•œ์ •๋˜์–ด์žˆ๊ณ , ํ•œ ๋ฒˆ์— ์šด๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์–‘๊ณผ, ํ•œ ๋ฒˆ ์šด๋ฐ˜์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค.

์ตœ์ ์˜ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๋”ฐ์ ธ๋ณด๊ธฐ์—” ๋ง์ด ์•ˆ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ œํ•œ์‹œ๊ฐ„์„ ๊ฑธ์–ด๋‘๊ณ , ์ด ์‹œ๊ฐ„์•ˆ์— ์ •ํ•ด์ง„ ๊ธˆ๊ณผ ์€์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋ คํ–ˆ๋‹ค.

์ด๋•Œ ์ œํ•œ์‹œ๊ฐ„์€ ์ด๋ถ„ํƒ์ƒ‰์„ ํ†ตํ•ด ์„ค์ •ํ•ด์ค€๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ดˆ๊ธฐ ๋ฒ”์œ„์ธ L๊ณผ R๊ฐ’์„ ์ •ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ, L์€ ์ตœ์†Œ์‹œ๊ฐ„์ด๋ฏ€๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ 0์œผ๋กœ ์„ค์ •ํ•˜์ž.

R์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ

์ž์›์„ ์šด๋ฐ˜ํ•  ๋„์‹œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๊ณ , ์šด๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์€ 1ํšŒ์— 1๋งŒ ์ด๋™๊ฐ€๋Šฅํ•˜๊ณ , ํŽธ๋„์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์€ 10^5 ๋ผ๊ณ  ์ตœ์•…์˜ ์กฐ๊ฑด์„ ๊ฑธ์–ด๋ณด์ž.

๊ธˆ๊ณผ ์€์€ ๊ฐ๊ฐ 10^9๋งŒํผ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์šด๋ฐ˜ํ•ด์•ผํ•  ์–‘์€ 2 * 10^9.

๋งˆ์ง€๋ง‰ ์šด๋ฐ˜๋•Œ๋Š” ์™•๋ณต์ด ์•„๋‹Œ ํŽธ๋„๋กœ๋งŒ ์ด๋™ํ•˜๋ฉด ๋˜๋ฏ€๋กœ

๋งˆ์ง€๋ง‰ ์šด๋ฐ˜ : 10^5์‹œ๊ฐ„ ์‚ฌ์šฉ, 1 ์šด๋ฐ˜

๋‚˜๋จธ์ง€ ์šด๋ฐ˜ : 2 * 10^5์‹œ๊ฐ„ ์‚ฌ์šฉ, 1์šด๋ฐ˜

๋”ฐ๋ผ์„œ ์ด ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 10^5 + (2 * 10^9 - 1) * 2 * 10^5 ์ด๋‹ค.

์ด๋•Œ 2 * 10^9 ์—์„œ 1๋นผ๋Š”๊ฑด ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ณ„์‚ฐ์ด๋ฏ€๋กœ 2 * 10^9๋กœ ์ƒ๊ฐํ•˜๋ฉด

4 * 10^14 + 10^5๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด๋‹ค. ์ด ๊ฐ’์„ R๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

 

์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ mid์‹œ๊ฐ„ ์•ˆ์— ์ •ํ•ด์ง„ ์–‘์„ ์šด๋ฐ˜์ด ๊ฐ€๋Šฅํ•˜๋ฉด R = mid -1๋กœ ์‹œ๊ฐ„์ด ์ž‘์•„์งˆ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ mid์‹œ๊ฐ„ ์•ˆ์— ์ •ํ•ด์ง„ ์–‘์„ ์šด๋ฐ˜ํ•˜์ง€ ๋ชปํ•˜๋ฉด L = mid + 1๋กœ ์‹œ๊ฐ„์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•œ๋‹ค.

 

1. ๋ชจ๋“  ๋„์‹œ์—์„œ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ์ด ๊ธˆ์˜ ์–‘์„ ๊ตฌํ•œ๋‹ค. (์ดํ•˜ Gold)

2. ๋ชจ๋“  ๋„์‹œ์—์„œ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ์ด ์€์˜ ์–‘์„ ๊ตฌํ•œ๋‹ค. (์ดํ•˜ Silver)

 

Gold ๊ฐ’์ด ์šด๋ฐ˜ํ•ด์•ผํ•  ๊ธˆ์˜ ์–‘ a ๋ณด๋‹ค ํฌ๊ณ , Silver ๊ฐ’์ด ์šด๋ฐ˜ํ•ด์•ผํ•  ์€์˜ ์–‘ b๋ณด๋‹ค ํฌ๋ฉด

์ฆ‰, (Gold >= a && Silver >= b)๋ฉด ์‹œ๊ฐ„ ๋‚ด์— ์šด๋ฐ˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋ ๊นŒ??

๋‹ต์€ ์•„๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‘ ๋„์‹œ๊ฐ€ ์žˆ๊ณ , ๊ธˆ๊ณผ ์€์„ ๊ฐ๊ฐ 10๋งŒํผ ์šด๋ฐ˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

1๋ฒˆ ๋„์‹œ๋Š” ๊ธˆ๊ณผ ์€์„ 10์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํŽธ๋„ 5์‹œ๊ฐ„, 1ํšŒ ์šด๋ฐ˜์— 5๋งŒํผ ์šด๋ฐ˜ ๊ฐ€๋Šฅ.

2๋ฒˆ ๋„์‹œ๋Š” ๊ธˆ๊ณผ ์€์„ 10์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํŽธ๋„ 10์‹œ๊ฐ„, 1ํšŒ ์šด๋ฐ˜์— 1๋งŒํผ ์šด๋ฐ˜ ๊ฐ€๋Šฅ.

๋งŒ์•ฝ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ mid๊ฐ€ 15์‹œ๊ฐ„์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

1๋ฒˆ ๋„์‹œ๋Š” 10 + 5 => 2ํšŒ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ๊ธˆ๊ณผ ์€์€ ๊ฐ๊ฐ 10

2๋ฒˆ ๋„์‹œ๋Š” 10 + 0 => 1ํšŒ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ๊ธˆ๊ณผ ์€์€ ๊ฐ๊ฐ 1

Gold, Silver ๊ฐ’์€ 11์ด๊ณ  ์ด๋Š” ๋ชจ๋‘ 10๋ณด๋‹ค ํฌ๋‹ˆ๊นŒ

(Gold >= a && Silver >= b) ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ 1๋ฒˆ ๋„์‹œ๊ฐ€ ๊ธˆ์„ 10์˜ฎ๊ธฐ๋Š” ๋™์•ˆ 2๋ฒˆ ๋„์‹œ๋Š” ์€์„ 1๋งŒํผ ๋ฐ–์— ์˜ฎ๊ธฐ์ง€ ๋ชปํ•˜๋ฏ€๋กœ a๋งŒ ์ถฉ์กฑ๋˜๊ณ  b๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๋”ฐ๋ผ์„œ ์กฐ๊ฑด์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค.

๊ธˆ, ์€ ์ƒ๊ด€์—†์ด ๋ชจ๋“  ๋„์‹œ์— ์‹œ๊ฐ„ ๋‚ด์— ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ์ž์›์˜ ์ด ํ•ฉ์„ Total ์ด๋ผ๊ณ  ํ•˜์ž.

Total >= a + b ๋ฅผ ๋งŒ์กฑํ•ด์•ผ ๊ธˆ๊ณผ ์€์„ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ (Total >= a + b && Gold >= a && Silver >= b) ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ์šด๋ฐ˜ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋ผ ํŒ๋‹จ์„ ๋‚ด๋ฆฐ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
 
long long solution(int a, int b, vector<int> g, vector<int> s, vector<int> w, vector<int> t) {
    long long answer = -1;
    long long L = 0long long R = 4 * pow(10,14+ pow(10,5);// ์ตœ์•…์˜ ๊ฒฝ์šฐ
    
    if(a == 0 && b == 0)
        return 0;
    
    while(L <= R){
        long long mid = (L + R) / 2//mid์‹œ๊ฐ„ ์•ˆ์— ๋ฌผ์ž ์กฐ๋‹ฌ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?
        long long Gold = 0;
        long long Silver = 0;
        long long Total = 0;
        for(int i = 0; i<w.size(); i++){
            long long move = (mid + t[i]) / (t[i] * 2); //์šด๋ฐ˜ ํšŸ์ˆ˜
            Gold += min((long long)g[i], move * w[i]);
            Silver += min((long long)s[i], move * w[i]);
            Total += min((long long)g[i] + s[i], move * w[i]); 
        }
        if(Total >= a + b && Gold >= a && Silver >= b){
            R = mid - 1;
            if(answer == -1)
                answer = mid;
            else answer = min(answer, mid);
            continue;
        }
        else{
            L = mid + 1;
        }
    }
    return answer;
}
cs
728x90