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

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

[C++/BOJ] 17179 : ์ผ€์ดํฌ ์ž๋ฅด๊ธฐ (์ด์ง„ํƒ์ƒ‰)

https://www.acmicpc.net/problem/17179

๋ฌธ์ œ

์ƒ์ผ์„ ๋งž์ดํ•œ ์ฃผ์„ฑ์ด๊ฐ€ ์ƒ์ผ ํŒŒํ‹ฐ๋ฅผ ์ค€๋น„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ฃผ์„ฑ์ด๋Š” ์ผ๋ฐ˜ ์ผ€์ดํฌ ๋Œ€์‹  ํ‰์†Œ ์ข‹์•„ํ•˜๋˜ ๋กค ์ผ€์ดํฌ๋ฅผ ์ค€๋น„ํ–ˆ๋‹ค. ๋กค ์ผ€์ดํฌ์—๋Š” ์žฅ์‹์ด ์กด์žฌํ•ด์„œ ํŠน์ • ์œ„์น˜์—์„œ๋งŒ ์ž๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์„ฑ์ด๋Š” ๋กค ์ผ€์ดํฌ ์กฐ๊ฐ์„ ํŒŒํ‹ฐ์— ์˜ฌ ์นœ๊ตฌ์˜ ์ˆ˜ ๋งŒํผ ์ค€๋น„ํ•˜๊ณ  ์‹ถ์–ด์„œ, ๊ฐ€์žฅ ์ž‘์€ ์กฐ๊ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง“๊ถ‚์€ ์ฃผ์„ฑ์ด์˜ ์นœ๊ตฌ๋“ค์€ ์ƒ์ผํŒŒํ‹ฐ์— ๋ช‡ ๋ช…์ด ์ฐธ์„ํ•˜๋Š”์ง€ ์ง์ ‘์ ์œผ๋กœ ์•Œ๋ ค์ฃผ์ง€๋ฅผ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋ฅผ ๋ชฉ๋ก์— ์ ์–ด, ๊ฐ ์ˆ˜๋งŒํผ ์กฐ๊ฐ์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ž‘์€ ์กฐ๊ฐ์˜ ๊ธธ์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 70cm์˜ ๋กค ์ผ€์ดํฌ์— ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ง€์ ์ด 5๊ตฐ๋ฐ(10cm, 20cm, 35cm, 55cm, 60cm)๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋งŒ์•ฝ ๋ชฉ๋ก์— ์ ํžŒ ์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ 3์ด๋ผ๋ฉด ์ด๋•Œ ๊ฐ€์žฅ ์ž‘์€ ์กฐ๊ฐ์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 15cm์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 20cm, 35cm, 55cm ์ง€์ ์„ ์ž๋ฅผ ๋•Œ ์ตœ๋Œ€๊ฐ€ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ž๋ฅด๋Š” ํšŸ์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ชฉ๋ก์˜ ๊ธธ์ด N๊ณผ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ง€์ ์˜ ๊ฐœ์ˆ˜ M, ๊ทธ๋ฆฌ๊ณ  ๋กค ์ผ€์ดํฌ์˜ ๊ธธ์ด์ธ ์ •์ˆ˜ L์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ M ≤ 1,000, 1 < L ≤ 4,000,000)

๋‹ค์Œ M์ค„์— ๊ฑธ์ณ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ Si๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Si < L)

๋‹ค์Œ N์ค„์— ๊ฑธ์ณ ์ž๋ฅด๋Š” ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ Qi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Qi ≤ M)

Si๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์–ด์ง€๊ณ  ์ค‘๋ณต๋˜๋Š” ์ˆ˜๋Š” ์—†์œผ๋ฉฐ, Qi๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ถœ๋ ฅ

N๊ฐœ ์ค„์— ๊ฑธ์ณ ๊ฐ ๋ชฉ๋ก์— ์žˆ๋Š” ํšŸ์ˆ˜๋Œ€๋กœ ๋กค ์ผ€์ดํฌ๋ฅผ ์ž˜๋ž์„ ๋•Œ ๊ฐ€์žฅ ์ž‘์€ ์กฐ๊ฐ์˜ ๊ธธ์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ 5 ์ด์ง„ํƒ์ƒ‰ ๋ฌธ์ œ.

์ผ€์ดํฌ ์กฐ๊ฐ์˜ ๊ธธ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ left, mid, right์„ ์ •ํ•œ๋‹ค.

์ด๋•Œ mid ๋Š” ๊ตฌํ•˜๋ ค๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ผ€์ดํฌ ์กฐ๊ฐ์˜ ๊ธธ์ด์ด๊ณ , ์ด mid์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ.

 

์ฒ˜์Œ์— n์ด ์กฐ๊ฐ ์ˆ˜์ธ์ค„ ์•Œ๊ณ  ํ’€์—ˆ๋‹ค๊ฐ€ ํ‹€๋ ธ์Œ

์กฐ๊ฐ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ž๋ฅด๋Š” ํšŸ์ˆ˜๋ผ์„œ for ๋ฌธ ๋๋‚œ ํ›„์— cut++๋ฅผ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ž๋ฅธ ํšŸ์ˆ˜๊ฐ€ ๋™์ผํ•ด๋„, ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ์ด mid๋ณด๋‹ค ์ปค์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.

if(tmp == cut && l-cutted < mid)

 

๊ทผ๋ฐ ์ด๋ถ„ํƒ์ƒ‰ ๋ฌธ์ œ ํ’€๋•Œ ๊ณ„์† ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด

 

์œ„์— 43๋ฒˆ์งธ ~ 48๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ์—์„œ left, right ๊ฐ’ ์ •ํ•ด์ค„๋•Œ

43๋ฒˆ์งธ ์ค„ ์ฝ”๋“œ์—์„œ

cut < tmp

์ด๋ ‡๊ฒŒ ํ•ด์„œ ํ‘ธ๋Š”๊ฑฐ๋ž‘

cut <= tmp

์ด๋ ‡๊ฒŒ ํ‘ธ๋Š”๊ฒŒ ๋‹ต์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š”๋ฐ....์™œ๊ทธ๋Ÿฐ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค

=์„ ๋ถ™์ด๋Š” ๊ธฐ์ค€์ด ๋ญ”์ง€.. ์–ด๋””์— ๊ฐ–๋‹ค๋ถ™์—ฌ์•ผํ•˜๋Š”์ง€ ์•„์ง ํ—ท๊ฐˆ๋ฆผ

 

 

 

 

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

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

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;
    int m;
    int l;
    vector<int> s;
    int tmp;
    cin >> n >> m >> l;
    for (int i = 0; i < m; ++i) {
        cin >> tmp;
        s.push_back(tmp);
    }

    for (int i = 0; i < n; ++i){
        cin >> tmp;

        int left = 0; // ์กฐ๊ฐ ๊ธธ์ด๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์กฐ๊ฐ ๊ธธ์ด ๊ธฐ์ค€ 
        int right = l;
        int mid; // ์ตœ์†Œ ์กฐ๊ฐ๊ธธ์ด์˜ ์ตœ๋Œ“๊ฐ’
        
        while (left <= right){
            mid = (left + right) / 2;
            int cut = 0;
            int cutted = 0;
            for (int i = 0; i < m; ++i){
                if (s[i] - cutted >= mid){
                    cut++;
                    cutted = s[i];
                }
            }
            // cut++; // ์กฐ๊ฐ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ž๋ฅธํšŸ์ˆ˜์ž„
            
            if(tmp == cut && l-cutted < mid) {// ๊ฐ™์„๋•Œ ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ์ด mid๋ณด๋‹ค ์ปค์•ผํ•˜๋Š”๋ฐ ์ž‘์œผ๋ฉด
                right = mid - 1;
            }
            else if (cut < tmp){
                right = mid - 1;
            }
            else{
                left = mid + 1;
            }
        }
        // cout << left << " "<< mid<<" "<< right<< '\n';
        cout << right << "\n";
    }
}