알고리즘/백준

1477_휴게소 세우기 ********

베리영young 2024. 9. 25. 19:04

사용 알고리즘: 이분탐색

사용 언어: java

 

대충 푸는 방법은 맞았는데,

한끝차이로 계속 틀림

=> 이거는 내가 이분탐색을 할 때, 미세한 조건을 어떻게 조정해야 할지 몰라서 생기는 문제 같음.

=> 생각하려면 시간이 오래 걸리는데, 테스트에서는 어떠나 싶어서, 케이스를 정해두고 돌려야 하나...

 

package week16;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

//휴게소 세우기
public class Main {
	static int n, m, l, arr[];
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt(); // 휴게소 개수
		m = sc.nextInt(); //더 지으려는 개수
		l = sc.nextInt(); //고속도로 길이
		arr = new int[n+2];
		for(int i=1; i<n+1; i++) {
			arr[i] = sc.nextInt();
		}
		arr[n+1] = l;
		Arrays.sort(arr);
		
		int left = 1;
		int right = l; //휴게소 없는 구간 길이 최대
		while(left <= right) { --> 이것
			int mid = (left + right) / 2;
			int cnt = solve(mid);
			
			if(cnt <= m) {
				right = mid-1; --> 이것
			}
			else {
				left = mid+1; --> 이것
			}
		}
		System.out.println(left); --> 이것
	}

	private static int solve(int mid) {
		int cnt = 0;
		for (int i = 0; i < n+1; i++) {
			int gap = arr[i+1] - arr[i] - 1;
			if(gap < mid) continue;
			else {
				cnt += gap / mid;
			}
		}
		return cnt;
	}

}

 

--> 이것이라고 쓰여있는 곳이 문제의 구간임

 

while(left <= right) while(left <= right) 혹은 while(left < right)
right = mid-1; right = mid-1; 혹은 right = mid;
left = mid+1; left = mid+1; 혹은 left = mid;
System.out.println( right );
==> (답 출력)
System.out.println(left); 혹은 System.out.println(right);
==> 이건 보통 right가 답이던데....

 

그럼 16개의 경우의 수를.... 돌려본다.....

경험상 최우선적으로 왼쪽에 있는 애들 먼저 돌려보면 되고, 하나씩 바꿔보기...ㅋㅋ...ㅋㅋ..