1 분 소요

문제

각각 길이가 다른 떡들 n개.

손님이 요청한 총 떡길이가 M일 때, 설정할 수 있는 절단기 높이의 최댓값은?


핵심 아이디어

‘특정 target을 감당할 수 있는가?’유형 이진탐색문제

절단기의 높이를 (가장긴떡길이/2)로 설정한 후, 감당 가능하면 왼쪽범위로, 불가능하면 오른쪽 범위로 절단기 높낮이 조정


파라메트릭 서치

최적화 문제를 결정문제로 바꾸어 해결하는 기법

되냐/안되냐?를 범위를 좁혀가며 탐색함으로써 최적의 해를 구함

=> 조건 : 현재 이 높이로 자르면 떡 최소 조건 만족 ? –> 만족 여부(예, 아니오) 도출

=> 범위를 좁힐 때 ‘이진 탐색’


코드
import java.util.* ; 

public class 떡볶이떡만들기 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in) ; 
		int n = sc.nextInt() ; // array 
		int m = sc.nextInt() ;  // target 
		
		int[] yum = new int[n] ; 
		for(int i = 0 ; i < n ; i++) {
			yum[i] = sc.nextInt() ; 
		}
		Arrays.sort(yum);
		int max = yum[yum.length-1]; 
		int start = 0, end = max ;  
		int answer = 0 ; 
		while(start <= end) {
			
			int mid = (start+end)/2 ; 
			if(isPossible(yum, mid,m )) {
				answer = mid; // ※ 최대한 덜 잘랐을 때가 정답이므로, 우선 answer에 기록 후 다음 반복 진행
				start = mid + 1  ;
			}else
				end = mid - 1 ; 
		}
		System.out.println(answer);
	} // main 
	
	public static boolean isPossible(int[] yum, int cut, int m) {
		int dduck = 0 ; 
		for(int i = 0 ; i < yum.length ; i++) {
			// 떡이 부족한 경우도 고려해줘야함 --> 안그러면 음수값이 누적
			if(yum[i] < cut)
				continue ; 
			
			dduck += (yum[i] - cut) ; 
			if(dduck >= m )
				return true ; 
		}
		return false ; 
	}
} // class 


댓글남기기