๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_27_์ด์ง ํ์ ๋ฌธ์ ํ์ด ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_27_์ด์ง ํ์ ๋ฌธ์ ํ์ด
์ง์ง์ํ์นด 2022. 2. 9. 00:58220209 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ 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
}