Post

parametric search

πŸ” Parametric Search (νŒŒλΌλ©”νŠΈλ¦­ μ„œμΉ˜)

νŒŒλΌλ©”νŠΈλ¦­ μ„œμΉ˜λž€ μ–΄λ–€ 쑰건을 λ§Œμ‘±ν•˜λŠ” β€˜μ΅œμ μ˜ κ°’(μ΅œμ†Œ/μ΅œλŒ€)’을 이진 탐색을 톡해 μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
μ •ν™•ν•œ 값을 μ°ΎλŠ” 일반 이진 탐색과 달리, 쑰건을 λ§Œμ‘±ν•˜λŠ” κ°€μž₯ μž‘μ€ κ°’ (λ˜λŠ” 큰 κ°’) 을 μ°ΎλŠ” 데에 초점이 μžˆμŠ΅λ‹ˆλ‹€.


βœ… ν™œμš© μ˜ˆμ‹œ

  • μ΅œλŒ€ν•œλ„λ‘œ κ°€λŠ₯ν•œ μ΅œμ†Œ λΉ„μš©, μ΅œμ†Œν•œλ„λ‘œ κ°€λŠ₯ν•œ μ΅œλŒ€ 거리 λ“±
  • 정닡이 μ•„λ‹ˆλΌ 정닡이 될 수 μžˆλŠ” β€˜κ°’μ˜ λ²”μœ„β€™λ₯Ό 이뢄 탐색함
  • λŒ€ν‘œ 문제: μ˜ˆμ‚° λΆ„λ°°, 곡유기 μ„€μΉ˜, λžœμ„  자λ₯΄κΈ° λ“±

πŸ”§ λ™μž‘ 방식

  • 일반적인 이진 탐색과 μœ μ‚¬ν•˜μ§€λ§Œ,
    mid 값이 쑰건을 λ§Œμ‘±ν•˜λŠ”μ§€ νŒλ‹¨ β†’ λ§Œμ‘±ν•˜λ©΄ 더 λ‚˜μ€ 값이 μžˆλŠ”μ§€ λ²”μœ„ μ‘°μ •



🍞 예제

총 5λͺ…μ˜ μ‚¬λžŒμ΄ 50, 30, 40cm의 μΈ„λŸ¬μŠ€λ₯Ό μ •ν™•νžˆ λ˜‘κ°™μ€ μ‚¬μ΄μ¦ˆλ‘œ 잘라 ν•œ 덩어리씩 λ°°λΆ„ν•˜λ €κ³  ν•œλ‹€.
μ΅œλŒ€ λͺ‡ cm으둜 λ‚˜λˆ„μ–΄λ¨Ήμ„ 수 μžˆμ„κΉŒ?

1
μ •λ‹΅ --> 20cm

생각해볼 것

  • 5μΈλΆ„μœΌλ‘œ μ •ν™•ν•˜κ²Œ λ‚˜λˆŒ 수 μžˆμ„λ•Œ μ΅œλŒ€κΈΈμ΄μΈκ°€?

진행과정은 μ•„λž˜μ™€ κ°™κ² λ‹€

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
βœ… λ§€κ°œλ³€μˆ˜ 탐색 μ§„ν–‰ κ³Όμ • 정리
[초기]
left = 1, right = 50

[1회차]
mid = (1 + 50) / 2 = 25
canCut(25) β†’ 4개 ❌
right = 24

[2회차]
mid = (1 + 24) / 2 = 12
canCut(12) β†’ 2 + 3 + 4 = 9개 βœ…
ans = 12, left = 13

[3회차]
mid = (13 + 24) / 2 = 18
canCut(18) β†’ 1 + 2 + 2 = 5 βœ…
ans = 18, left = 19

[4회차]
mid = (19 + 24) / 2 = 21
canCut(21) β†’ 1 + 1 + 2 = 4 ❌
right = 20

[5회차]
mid = (19 + 20) / 2 = 19
canCut(19) β†’ 1 + 2 + 2 = 5 βœ…
ans = 19, left = 20

[6회차]
mid = (20 + 20) / 2 = 20
canCut(20) β†’ 1 + 2 + 2 = 5 βœ…
ans = 20, left = 21

[μ’…λ£Œ]
left = 21 > right = 20 β†’ break
μ΅œμ’… ans = 20



μ •λ‹΅ μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
총 5λͺ…μ˜ μ‚¬λžŒμ΄ μΈ„λŸ¬μŠ€λ₯Ό μ •ν™•νžˆ λ˜‘κ°™μ€ μ‚¬μ΄μ¦ˆλ‘œ 잘라 ν•œ 덩어리씩 λ°°λΆ„ν•˜λ €κ³  ν•œλ‹€.
μ΅œλŒ€ λͺ‡ cm으둜 λ‚˜λˆ„μ–΄λ¨Ήμ„ 수 μžˆμ„κΉŒ?
int[] churos = {50, 30, 40}
정닡은 20cm 
*/


import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

import java.util.Arrays;

public class Solution{
	static int[] churos = {50, 30, 40};
	static int people = 5;
	static {
		Arrays.sort(churos);
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int res = parametric_search(churos, people);
		System.out.println(res);
	}
	
	public static int parametric_search(int[] churos, int people) {
		int left = 1;
		int right = upperBound(churos);
		int ans = -1;
		
		while (left <= right) {
			int mid = (left + right) / 2;
			
			if (canCut(churos, mid, people)) {
				ans = mid;
				left = mid + 1;
			}
			else {
				right = mid - 1;
			}
			
			
		}
		return ans;
		
	}
	
	public static boolean canCut(int[] churos, int mid, int people) {
		int cnt = 0;
		for (int i : churos) {
			cnt += (i / mid);
		}
		return cnt >= people;	
	}
	
	public static int upperBound(int[] arr) {
		int max = 0;
		for (int i : arr) {
			if (i > max) {
				max = i;
			}
		}
		return max;
	}
	
	
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags