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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ

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

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

 

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

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

programmers.co.kr

๋‚ด๊ตฌ๋„๊ฐ€ ์ •ํ•ด์ง„ ์ง•๊ฒ€๋‹ค๋ฆฌ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ˆ๋‹ˆ์ฆˆ ์นœ๊ตฌ๋“ค์˜ ์ˆ˜์˜ ์ตœ๋Œ€๋ฅผ ๋ฆฌํ„ดํ•˜์ž.

 

ํ’€์ด

์ง์ ‘ ํ•œ ๋ช…, ํ•œ ๋ช… ๊ฑด๋„ˆ๊ฐ€๋ฉด์„œ ๋Œ์˜ ๋‚ด๊ตฌ๋„๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉด ๋ฌผ๋ก  ์ •๋‹ต์€ ์ถœ๋ ฅ์ด ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€

๋‚ด๊ตฌ๋„๊ฐ€ 0์ธ ๋Œ์ด ์—ฐ์†ํ•ด์„œ K๊ฐœ ์ด์ƒ ์žˆ์„ ๋•Œ, ๊ทธ๋•Œ๋Š” ๋” ์ด์ƒ ์‚ฌ๋žŒ์ด ๊ฑด๋„ˆ๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค๋ฆฌ๋ฅผ K๊ฐœ์”ฉ ๋‚˜๋ˆ ์„œ ๋ดค์„ ๋•Œ, K๊ฐœ์˜ ๋‹ค๋ฆฌ ์ค‘ ๋‚ด๊ตฌ๋„๊ฐ€ ๊ฐ€์žฅ ํฐ ๋‹ค๋ฆฌ์˜ ๋‚ด๊ตฌ๋„๋งŒํผ ์‚ฌ๋žŒ์ด ์ง€๋‚˜๊ฐ€๋ฉด K๊ฐœ์˜ ์ง•๊ฒ€๋‹ค๋ฆฌ๋Š” ๋ชจ๋‘ 0์ด ๋œ๋‹ค.

K๊ฐœ์”ฉ ๋‚˜๋ˆ ์„œ ๋ดค์„ ๋•Œ, ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’๋“ค ์ค‘ ์ตœ์†Œ๊ฐ’์ด ๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ€ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งฐ์„ ๋•Œ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ํ†ต๊ณผํ•˜์ง€๋งŒ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.

 

๋ณดํ†ต ์ด๋ ‡๊ฒŒ ํฐ ๋ฒ”์œ„์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” ์ด๋ถ„ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‚ฌ๋žŒ์˜ ์ˆ˜๋Š” 1์ผ ๊ฒƒ์ด๊ณ , ์ตœ๋Œ€๋Š” ์ง•๊ฒ€๋‹ค๋ฆฌ๋“ค์˜ ๋‚ด๊ตฌ๋„ ์ค‘ ์ตœ๋Œ€๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

int L = 1, int R = *max_element(stones.begin(), stones.end();

์ด๋•Œ ๊ฑด๋„ˆ๊ฐˆ ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ mid๊ฐ’์œผ๋กœ ์„ ์ •ํ•œ๋‹ค.

๋งŒ์•ฝ mid๋งŒํผ์˜ ์‚ฌ๋žŒ์ด ๊ฑด๋„ˆ๊ฐ”๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์—ฐ์†๋œ 0์ด K๊ฐœ ๋ฏธ๋งŒ์œผ๋กœ ๋‚˜์˜จ๋‹ค๋ฉด mid๋งŒํผ์˜ ์‚ฌ๋žŒ์ด ๊ฑด๋„ˆ๊ฐ€๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ mid๋งŒํผ ๊ฑด๋„œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์—ฐ์†๋œ 0์ด K๊ฐœ ์ด์ƒ์ด ๋‚˜์˜ค๋ฉด ๊ทธ๋•Œ์˜ mid๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ๋œ๋‹ค.

์—ฐ์†์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” 0์˜ ๊ธธ์ด ์ค‘ ์ตœ๋Œ€๊ฐ’์„ Max_zero๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

        if(Max_zero >= k)
            R = mid - 1;
        else{
            answer = max(answer, mid);
            L = mid + 1;
        }

์œ„์˜ ์‹์„ ๋”ฐ๋ผ ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
 
int solution(vector<int> stones, int k) {
    int answer = 0;
    int L = 0int R = *max_element(stones.begin(), stones.end());
    
    while(L <= R){
        int mid = (L + R) / 2;
        int zero = 0;
        int Max_zero = 0;
        for(int i = 0; i< stones.size(); i++){
            if(stones[i] - mid < 0)
                zero++;
            else{
                Max_zero = max(Max_zero, zero);
                zero = 0;
            }
        }
        Max_zero = max(Max_zero, zero);
        
        if(Max_zero >= k)
            R = mid - 1;
        else{
            answer = max(answer, mid);
            L = mid + 1;
        }
    }
    return answer;
}
cs

 

728x90