๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_27_์ด์ง„ ํƒ์ƒ‰ ๋ฌธ์ œํ’€์ด ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_27_์ด์ง„ ํƒ์ƒ‰ ๋ฌธ์ œํ’€์ด

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 9. 00:58
728x90
๋ฐ˜์‘ํ˜•

220209 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=jjOmN2_lmdk&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=27 

 

 

 

 

1. ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ (Parametric Search)

: ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ (์˜ˆ or ์•„๋‹ˆ์˜ค) ๋กœ ๋ฐ”๊พธ์–ด ํ•ด๊ฒฐ

( ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ์•Œ๋งž์€ ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ )

 

 

 

< ๋ฌธ์ œ1 > ๋–ก๋ณถ์ด ๋–ก ๋งŒ๋“ค๊ธฐ

: ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด(H) ๋ฅผ ์ง€์ •ํ•˜๋ฉด, ์ค„์ง€์–ด์ง„ ๋–ก์„ ํ•œ ๋ฒˆ์— ์ ˆ๋‹จ

: ๋†’์ด๊ฐ€ H ๋ณด๋‹ค ๊ธด ๋–ก์€ H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆฌ๊ณ , ๋‚ฎ์€ ๋–ก์€ ์ž˜๋ฆฌ์ง€ ์•Š์Œ

: ์†๋‹˜์€ ์ž˜๋ฆฐ ๋–ก ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ๊ฐ

: ์†๋‹˜์ด ์š”์ฒญํ•œ ์ด ๊ธธ์ด๊ฐ€ M ์ผ ๋•Œ, ์ ์–ด๋„ M๋งŒํผ์˜ ๋–ก์„ ์–ป๊ธฐ ์œ„ํ•ด, ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’

 

- ์ ์ ˆํ•œ ๋†’์ด๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋†’์ด H ๋ฐ˜๋ณตํ•ด์„œ ์กฐ์ •

- ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ๋’ค์—, ์กฐ๊ฑด์˜ ๋งŒ์กฑ ์—ฌ๋ถ€์— ๋”ฐ๋ผ์„œ ํƒ์ƒ‰ ๋ฒ”์œ„ ์ขํž˜

- ํฐ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ์ด์ง„ ํƒ์ƒ‰ !!!

 

1) ํ•„์š”ํ•œ ๋–ก ๊ธธ์ด M = 6

2) ์‹œ์ž‘์  0, ์ค‘๊ฐ„์  9, ๋์ , 19      => 25.... SO BIG

3) ์‹œ์ž‘์  15, ์ค‘๊ฐ„์  19, ๋์ , 17     =>2....  BIG

3) ์‹œ์ž‘์  15, ์ค‘๊ฐ„์  16, ๋์ , 15     => WOW~

=> ์ค‘๊ฐ„์  ๊ฐ’์€ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก "์ตœ์ ํ™”๋œ ๊ฐ’"์ด๋ฏ€๋กœ ! ๋–ก ๊ธธ์ดํ•ฉ์ด ๋–ก ๊ธธ์ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ๋งŒ ์ค‘๊ฐ„์  ๊ฐ’ ๊ธฐ๋ก!

 

 

 

 

  • python
    # ๋–ก ๊ฐœ์ˆ˜ n ์™€ ํ•„์š”ํ•œ ๋–ก ๊ธธ์ด m
    n, m = map(int, input().split())
    
    # ๊ฐ ๋–ก ๊ฐœ๋ณ„ ๋†’์ด
    array = list(map(int, input().split()))
    
    # ์ด์ง„ํƒ์ƒ‰ ์œ„ํ•ด ์‹œ์ž‘, ๋์ 
    start = 0
    end = max(array)
    
    # ์ด์ง„ํƒ์ƒ‰ ์‹œ์ž‘
    result = 0
    while (start <= end) :
        total = 0
        mid = (start + end) // 2
        for x in array :
            if x > mid :
                total += x -mid
        # ๋ถ€์กฑ
        if total < m :    # ์™ผ
            end = mid - 1
        # ์ถฉ๋ถ„ํ•˜๋‹ˆ ๋œ ์ž๋ฅด๊ธฐ
        else :    # ์˜ค๋ฅธ
            result = mid
            start = mid + 1
    
    print(result)

  •  c++
#include <bits/stdc++.h>

using namespace std;

// ๋–ก์˜ ๊ฐœ์ˆ˜(N)์™€ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด(M)
int n, m;
// ๊ฐ ๋–ก์˜ ๊ฐœ๋ณ„ ๋†’์ด ์ •๋ณด 
vector<int> arr;

int main(void) {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }
    // ์ด์ง„ ํƒ์ƒ‰์„ ์œ„ํ•œ ์‹œ์ž‘์ ๊ณผ ๋์  ์„ค์ •
    int start = 0;
    int end = 1e9;
    // ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ (๋ฐ˜๋ณต์ ) 
    int result = 0; 
    while (start <= end) {
        long long int total = 0;
        int mid = (start + end) / 2;
        for (int i = 0; i < n; i++) {
            // ์ž˜๋ž์„ ๋•Œ์˜ ๋–ก์˜ ์–‘ ๊ณ„์‚ฐ
            if (arr[i] > mid) total += arr[i] - mid; 
        }
        if (total < m) { // ๋–ก์˜ ์–‘์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ๋” ๋งŽ์ด ์ž๋ฅด๊ธฐ(์™ผ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
            end = mid - 1;
        }
        else { // ๋–ก์˜ ์–‘์ด ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ ๋œ ์ž๋ฅด๊ธฐ(์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
            result = mid; // ์ตœ๋Œ€ํ•œ ๋œ ์ž˜๋ž์„ ๋•Œ๊ฐ€ ์ •๋‹ต์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์—์„œ result์— ๊ธฐ๋ก 
            start = mid + 1;
        }
    }
    cout << result << '\n';
}
© 2022 GitHub, Inc.
  • java
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            
            // ๋–ก์˜ ๊ฐœ์ˆ˜(N)์™€ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด(M)
            int n = sc.nextInt();
            int m = sc.nextInt();
    
            // ๊ฐ ๋–ก์˜ ๊ฐœ๋ณ„ ๋†’์ด ์ •๋ณด 
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
    
            // ์ด์ง„ ํƒ์ƒ‰์„ ์œ„ํ•œ ์‹œ์ž‘์ ๊ณผ ๋์  ์„ค์ •
            int start = 0;
            int end = (int) 1e9;
            // ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ (๋ฐ˜๋ณต์ )
            int result = 0; 
            while (start <= end) {
                long total = 0;
                int mid = (start + end) / 2;
                for (int i = 0; i < n; i++) {
                    // ์ž˜๋ž์„ ๋•Œ์˜ ๋–ก์˜ ์–‘ ๊ณ„์‚ฐ
                    if (arr[i] > mid) total += arr[i] - mid; 
                }
                if (total < m) { // ๋–ก์˜ ์–‘์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ๋” ๋งŽ์ด ์ž๋ฅด๊ธฐ(์™ผ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
                    end = mid - 1;
                }
                else { // ๋–ก์˜ ์–‘์ด ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ ๋œ ์ž๋ฅด๊ธฐ(์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํƒ์ƒ‰)
                    result = mid; // ์ตœ๋Œ€ํ•œ ๋œ ์ž˜๋ž์„ ๋•Œ๊ฐ€ ์ •๋‹ต์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์—์„œ result์— ๊ธฐ๋ก 
                    start = mid + 1;
                }
            }
    
            System.out.println(result);
        }
    
    }

 

 

 

 

< ๋ฌธ์ œ2 > ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ์ˆ˜์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

: N ๊ฐœ์˜ ์›์†Œ ์ˆ˜์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ

: ์ˆ˜์—ด์—์„œ x ๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ํšŸ์ˆ˜

: O(logN) ์œผ๋กœ ํ•˜๊ธฐ ( ์„ ํ˜• ํƒ์ƒ‰์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ )

: ๋ฐ์ดํ„ฐ ์ •๋ ฌ๋˜์–ด, ์ด์ง„ ํƒ์ƒ‰ ๊ฐ€๋Šฅ

: ํŠน์ • ๊ฐ’์ด ๋“ฑ์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์™€ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์œ„์น˜ ์ฐจ์ด  ๊ณ„์‚ฐ

 

 

  • python
from bisect import bisect_left, bisect_right

def count_by_range(a, left_value, right_value) :
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)

    return right_index - left_index

# ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ n, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’ x
n, x = map(int, input().split())
array = list(map(int, input().split()))

# [x, x] ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ
count = count_by_range(array, x, x)

if count == 0 :
    print(-1)
else :
    print(count)

  • c++
#include <bits/stdc++.h>

using namespace std;

int countByRange(vector<int>& v, int leftValue, int rightValue) {
	vector<int>::iterator rightIndex = upper_bound(v.begin(), v.end(), rightValue);
    vector<int>::iterator leftIndex = lower_bound(v.begin(), v.end(), lowerValue);
    return rightIndex - leftIndex
}

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments