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

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

by Jaeguk 2022. 6. 21.
๋ฌธ์ œ ๋งํฌ

https://programmers.co.kr/learn/courses/30/lessons/43236

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ง•๊ฒ€๋‹ค๋ฆฌ

์ถœ๋ฐœ์ง€์ ๋ถ€ํ„ฐ distance๋งŒํผ ๋–จ์–ด์ง„ ๊ณณ์— ๋„์ฐฉ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ์‚ฌ์ด์—๋Š” ๋ฐ”์œ„๋“ค์ด ๋†“์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์œ„ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์ฐฉ์ง€์ ์ด 25๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๊ณ , ๋ฐ”์œ„๊ฐ€

programmers.co.kr

๋ฐ”์œ„๋ฅผ n๊ฐœ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ, ๊ฐ ์ง€์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ๋ฐ”์œ„๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฌธ์ œ.

 

ํ’€์ด
  • ํ’€์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ ์ง€์ ๋“ค ์‚ฌ์ด์— ๋ฒŒ์–ด์ ธ์•ผํ•  ์ตœ์†Œ ๊ฐ„๊ฒฉ์„ "์ด๋ถ„ํƒ์ƒ‰"์„ ํ†ตํ•ด์„œ ํƒ์ƒ‰ํ•œ๋‹ค.

๋ฒŒ์–ด์ €์•ผํ•  ๊ฐ„๊ฒฉ์˜ ๋ฒ”์œ„๋Š” 0 ~ distance ์ด๋‚ด ์ผ ๊ฒƒ์ด๋‹ค.

L = 0, R = distance๋กœ ์žก๊ณ  mid ๊ฐ’์„ ์ง€์ ๋“ค ์‚ฌ์ด ๋ฒŒ์–ด์ ธ์•ผํ•  ์ตœ์†Œ ๊ฐ„๊ฒฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

1. ๋จผ์ €, ๊ฐ ์ง€์ ๋“ค์˜ ์œ„์น˜๊ฐ€ ๋ถˆ๊ทœ์น™ํ•˜๊ฒŒ ์ฃผ์–ด์ง€๋ฏ€๋กœ sort ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•ด์ค€๋‹ค.

2. ๊ฐ ์ง€์ ์‚ฌ์ด๊ฐ€ ์ตœ์†Œ mid ๋งŒํผ ๋ฒŒ์–ด์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐœ์˜ ์ง€์ ์„ ์ง€์›Œ์•ผํ•˜๋Š” ์ง€ ์„ผ๋‹ค.

๋ฒŒ์–ด์ ธ์•ผํ•˜๋Š” ์ตœ์†Œ ๊ฐ„๊ฒฉ์ด ์ปค์งˆ์ˆ˜๋ก ์ง€์›Œ์•ผํ•  ๋ฐ”์œ„๊ฐ€ ๋งŽ์•„์งˆ ๊ฒƒ์ด๋‹ค.

=> ๊ทธ๋ž˜์•ผ ๊ฐ„๊ฒฉ์ด ๋ฒŒ์–ด์ง€๋‹ˆ๊นŒ

๋งŒ์•ฝ ์ง€์›Œ์•ผํ•  ๋ฐ”์œ„์˜ ์ˆ˜๊ฐ€ n๊ฐœ๋ณด๋‹ค ๋งŽ๋‹ค?? => ๋„ˆ๋ฌด ๋งŽ์ด ์ง€์›Œ์•ผํ•˜๋ฏ€๋กœ ๊ฐ„๊ฒฉ์„ ์ขํ˜€์•ผํ•œ๋‹ค.

์ด๋•Œ๋Š” R = mid - 1๋กœ ์„ค์ •ํ•ด์„œ mid ๊ฐ’์ด ์ž‘์•„์งˆ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ง€์›Œ์•ผํ•  ๋ฐ”์œ„์˜ ์ˆ˜๊ฐ€ n๊ฐœ๋ณด๋‹ค ์ ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค?? => ์ด๋•Œ์˜ ๊ฐ„๊ฒฉ์€ ์œ ํšจํ•œ ๊ฐ’์ด๊ณ  ๊ฐ„๊ฒฉ์„ ๋” ๋ฒŒ๋ ค๋ด๋„ ๋œ๋‹ค.

์ด๋•Œ๋Š” L = mid + 1๋กœ ์„ค์ •ํ•ด์„œ mid ๊ฐ’์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•œ๋‹ค.

 

์œ ํšจํ•œ ๊ฐ„๊ฒฉ๋“ค ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ.

 
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
 
int binary_search(int distance, vector<int> rocks, int n){
    int L = 0;
    int R = distance - 1;
    int ret = 1;
    while(L <= R){
        int now = 0;
        int mid = (L+R)/2// ๋ฐ”์œ„ ์‚ฌ์ด ์ตœ์†Œ mid ๋งŒํผ ๊ฐ„๊ฒฉ์ด ๋ฒŒ์–ด์ ธ์•ผํ•จ
        int cnt = 0;
        for(int i = 0; i<rocks.size(); i++){
            if(rocks[i] - now >= mid){
                cnt++;
                now = rocks[i];
            }
        }
        //rocks.size() - cnt ๊ฐœ๋ฅผ ์ง€์›Œ์•ผ mid ๊ฐ„๊ฒฉ ์œ ์ง€๊ฐ€๋Šฅ
        
        if(rocks.size() - cnt <= n){
            L = mid + 1//๊ฐ„๊ฒฉ์„ ๋” ๋ฒŒ๋ ค๋ด๋„ ๋จ
            ret = max(ret, mid);
        }
        else if(rocks.size() - cnt > n) // ๋” ๋งŽ์ด ์ง€์›Œ์•ผํ•จ => ๊ฐ„๊ฒฉ์„ ์ขํ˜€์•ผํ•จ
            R = mid - 1;
    }
    return ret;
}
 
int solution(int distance, vector<int> rocks, int n) {
    int answer = 0;
    sort(rocks.begin(), rocks.end());
    answer = binary_search(distance, rocks, n);
    return answer;
}
cs

 

728x90