백준 알고리즘

백준 (2512) - 예산

vitamin3000 2025. 2. 27. 21:35

 

이번 문제는 새롭게, 이진 탐색과 매개변수 탐색을 활용하는 문제이다

 

이진 탐색은 정렬된 배열에 대해 start, mid, end 값을 변경해가며 값을 찾는 과정이다

 

초기 값은 다음과 같다

start = 0;

end = n - 1;

mid = parseInt(start+end)/2))

 

하지만 우리는 배열에서 존재하는 값에서 mid 값이 아닌, 새로운 mid 값을 찾아야 하기 때문에 

상한액의 가장 작은 값은 0, 가장 큰 값은 배열의 맨 마지막 값이기에 

이 둘을 가지고 중간 값을 정한다

값은 (0 + 150) / 2 = 75로,

해당 배열 인덱스 값을 모두 순회하며 75보다 작으면 그 값을 사용하고, 크다면 75를 사용한다

let start = 0;
let end = arr[n-1];
let mid = parseInt((start + end)/2);

let mid = parseInt((start + end)/2);

for(let i =0; i< n; i++)
{
    total += Math.min(arr[i], mid);
}

 

110, 120, 140, 150 배열에 값에 대입해보면

75, 75, 75, 75로 300이다 

우리의 목표값인 485 >= 300 이므로, 중간 값을 75 + 1한 값으로 start를 76으로 설정하여 다시 mid 값을 계산한다

(76 + 150) / 2 = 113으로,

110, 113, 113, 113으로 449이다

우리의 목표값인 485 >= 449으로, 중간 값을 113 + 1한 값으로 start를 114으로 설정하여 다시 mid 값을 계산한다

(114 + 150) / 2 = 132

110, 120, 132, 132으로 494이다

우리의 목표값인 485 <= 494으로, 중간 값을 end 값을 -1한 값으로 131로 섲렁하여 다시 mid 값을 계산한다.

 

위에서 t보다 큰 경우와 작은 경우를 모두 살펴보았다.

이러한 반복을 통해 모든 경우의 수를 이진탐색으로 확인하는 아래 조건이 만족되면 종료되어 

start <= end

 

 

최종 mid 값을 출력하면 된다.