์‹ค๋ฒ„1 : ์ด๋ถ„ ํƒ์ƒ‰, Parametric Search ๋ฌธ์ œ์ด๋‹ค.

์ƒ๊ฐ

์ฒ˜์Œ์— ์ด ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ํ’€๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, 100000๊ฐœ ๋ฅผ 50000๊ฐœ์˜ ๋ธ”๋ฃจ๋ ˆ์ด์— ๋‹ด์œผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ณ„์†ํ•ด์„œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉฐ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ์‹œ๊ฐ„ ์ œํ•œ์ด 2์ดˆ์ด๊ณ , ๋˜ํ•œ ์žฌ๊ท€ํ•จ์ˆ˜์˜ depth๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ ธ ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๊ณ ๋ฏผ์„ ํ•˜๋˜ ์ค‘, ๋‹ต์„ ๋จผ์ € ์ œ์•ˆํ•˜๊ณ , ์ด ๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ญ์œผ๋กœ ์ถ”์ ํ•˜๋ฉด ์–ด๋–จ๊นŒํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜(parametric Search)๋ผ ํ•œ๋‹ค.

์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ๋กœ ๋ฐ”๊พธ์–ด ํ•ด๊ฒฐํ•œ๋‹ค.

์ด์ง„ ํƒ์ƒ‰๊ณผ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์œ„์˜ ๋ฌธ์ œ๋Š” ๊ฒฐ๊ตญ, N๊ฐœ์˜ ์ž…๋ ฅ์ด ๋“ค์–ด์™”์„ ๋•Œ, ์ด๊ฑธ M๊ฐœ๋กœ ๋‚˜๋ˆ„๊ณ , M๊ฐœ๋กœ ๋‚˜๋ˆˆ ๊ฐ๊ฐ์˜ ๋ญ‰ํ……์ด๋“ค ์‚ฌ์ด์—์„œ ์ตœ๋Œ“๊ฐ’๋“ค์„ ๋ฝ‘์•„ ๊ทธ๊ฒƒ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. (์‘?)

  1. ์ž…๋ ฅ N์„ M๊ฐœ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ž๋ฅธ๋‹ค. ๋‹ค์–‘ํ•œ ๊ฐ€์ง€์ˆ˜๋กœ ์ž๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ€์ง€์ˆ˜๋ฅผ K๋ผ ํ•˜์ž.
  2. ๊ทธ ์ง‘ํ•ฉ๋“ค์˜ ํ•ฉ์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋‹ค.
  3. ๊ทธ ์š”์†Œ๋“ค์„ ๊ฐ€์ง€๋Š” ์ง‘ํ•ฉ L๋ฅผ ๋งŒ๋“ ๋‹ค. (K์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋Š” M๊ฐœ, ๋ฐœ์ƒํ•˜๋Š” ์ง‘ํ•ฉ L์˜ ๊ฐœ์ˆ˜๋Š” K๊ฐœ)
  4. ๋ฐœ์ƒํ•œ ๋ชจ๋“  L ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์š”์†Œ๋“ค์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ๋‹ค. ๊ทธ ์ตœ๋Œ“๊ฐ’์„ ๋ชจ์€ ์ง‘ํ•ฉ์„ P๋ผ ํ•˜์ž. (P์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋Š” K๊ฐœ)
  5. P์ง‘ํ•ฉ์˜ ์š”์†Œ๋“ค ์ค‘ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

์™„์ „ ํƒ์ƒ‰์„ ํ•œ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ฒฐ๊ตญ ์ด ๋ฌธ์ œ๋Š” ์ตœ์ ์˜ ๋””์Šคํฌ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ์—์„œ ์ƒˆ๋กœ์šด ๋ฐœ์ƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ต์€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐฉ๋ฒ•

์ด ๋ฌธ์ œ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ disk ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด disk ํฌ๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์‚ฐํ•ด๋ณด์ž. N = 100000 ์ด๊ณ , ๊ฐ๊ฐ์˜ ๋™์˜์ƒ ์šฉ๋Ÿ‰์€ 10000์ด ์ตœ๋Œ€์ด๋ฏ€๋กœ, ์ด ๋™์˜์ƒ ๋ชจ๋‘๋ฅผ ํ•œ disk์— ๋„ฃ๋Š”๋‹ค๋ฉด 1000000000ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€์ด๋‹ค. ์ผ๋‹จ ์ดํ•ด๋ฅผ ํ•˜๋Š” ๊ณผ์ •์ด๊ธฐ์— ์ตœ๋Œ“๊ฐ’์„ 100์ด๋ผ ๊ฐ€์ •ํ•˜๊ฒ ๋‹ค.

๊ณผ์ •์€ ์ด๋ถ„ ํƒ์ƒ‰๊ณผ ๋น„์Šทํ•˜๋‹ค. ๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ, ์ตœ๋Œ€์—์„œ ๋ฐ˜์ด ๋‹ต์ด ๋˜๋Š”์ง€ ๋˜์ง€ ์•Š๋Š”์ง€ ํŒ๋‹จํ•œ๋‹ค.

๋„ˆ๋ฌด ๋””์Šคํฌ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ์„ ํƒ์ƒ‰ํ•œ๋‹ค.

๋„ˆ๋ฌด ๋””์Šคํฌ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋ฉด ์™ผ์ชฝ์„ ํƒ์ƒ‰ํ•œ๋‹ค.

์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‹ต์„ ๋„์ถœํ•œ๋‹ค.

๊ฒฐ๊ตญ ์œ„ ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ์€, ์›ํ•˜๋Š” ๋‹ต์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ด ๊ฐ’์ด ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์—ˆ๋‹ค๋ฉด, ์–ด๋– ํ•œ ์กฐ๊ฑด์—์„œ ํƒ์ƒ‰์˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€, ํ•ด๋‹น ๋ฌธ์ œ์˜ ํŠน์ง•์€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ์˜ ํŠน์ง•

M๊ฐœ์˜ disk๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, disk ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ๋งŒ์•ฝ 10๊ฐœ์˜ disk๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ต์€ N์„ 10๊ฐœ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ž‘๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌผ๋ก  10๊ฐœ๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ disk๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ 10๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋‹ต๊ณผ ๊ฐ™๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜๋Š” ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ 10๊ฐœ๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ disk๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋„ ๋‹ต์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋Œ€์ƒ์ด ๋œ๋‹ค.
  • ๋˜ํ•œ M๊ฐœ์˜ disk๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. ์ฒ˜์Œ์— M๊ฐœ๋กœ๋งŒ ๋‚˜๋‰˜๋ฉด ๋‹ต์ด๋ผ ํ•ด์„œ ํ‹€๋ ธ๋‹ค. ใ… 

ํƒ์ƒ‰ ์กฐ๊ฑด

์ œ์‹œํ•œ ๋ธ”๋ฃจ๋ ˆ์ด Size๋ฅผ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๋‚˜์˜จ ๊ฐ’์ด M๋ณด๋‹ค ํฌ๋ฉด Size๋ฅผ ํ‚ค์šด๋‹ค.

์ œ์‹œํ•œ Size๋ฅผ ๊ฐ€์ง€๊ณ  N๋ฅผ ์ตœ๋Œ€ํ•œ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐฏ์ˆ˜(M)๋ณด๋‹ค disk๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜ค๋ฉด, ํ˜„์žฌ disk ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„ ๋” ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์ด๋‹ค. ๋”ฐ๋ผ์„œ disk ํฌ๊ธฐ๋ฅผ ํ‚ค์›Œ์•ผ ํ•œ๋‹ค.

์ œ์‹œํ•œ ๋ธ”๋ฃจ๋ ˆ์ด Size๋ฅผ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๋‚˜์˜จ ๊ฐ’์ด M๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ง€๊ธˆ ์ œ์‹œํ•œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

๋‚˜์˜จ ๊ฐ’๊ณผ ์ด์ „์— ํƒ์ƒ‰ํ•œ ๋‹ต ์ค‘ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

์ œ์‹œํ•˜๋Š” ๋‹ต์€ video์˜ ๊ฐ’๋ณด๋‹ค๋Š” ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ์ปค์•ผํ•œ๋‹ค.

1 2 3 4 5 ๋ผ๋Š” video๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ๋•Œ, ๋‚ด๊ฐ€ ์ œ์‹œํ•˜๋Š” ๋‹ต์€ 5๋ณด๋‹ค ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ์ปค์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ 3์ด๋ผ๋Š” ๋‹ต์„ ์ œ์‹œํ•œ๋‹ค๋ฉด 4์™€ 5๋Š” disk์— ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์—†์œผ๋ฏ€๋กœ ๋…ผ๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค.

Code

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int video[100000];
int N, M, ans = 1e9;
 
bool isOk(int value){
    int sum = 0, count = 1;
    for (int i = 0; i < N; i++) {
        if (value < video[i]) return false;
        if (sum + video[i] > value) {
            sum = video[i];
            count++;
        }
        else sum += video[i];
        if (count > M) return false;
    }
    return true;
}
 
int main(){
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        cin >> video[i];
    }
 
    int left = 0, right = 1e9;
    while (left <= right) {
        int mid = (left+right)/2;
        if (isOk(mid)) {
            ans = min(ans, mid);
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    cout << ans << '\n';
}

Reference