<모든 코드는 C++를 기반으로 작성되었습니다.>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
static int N, M;
static vector<int> vecN, vecM;
bool binarySearch(int key) {
int start = 0, end = vecN.size() - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (key == vecN[mid]) return true;
else if (key < vecN[mid]) end = mid - 1;
else start = mid + 1;
}
return false;
}
int main() {
cin >> N;
vecN = vector<int>(N);
for (int i = 0; i < N; ++i) cin >> vecN[i];
cin >> M;
vecM = vector<int>(M);
for (int i = 0; i < M; ++i) cin >> vecM[i];
sort(begin(vecN), end(vecN)); // 중요! 이진탐색 전 정렬 필수!
for (int i = 0; i < M; ++i) {
if (binarySearch(vecM[i])) cout << "YES ";
else cout << "NO ";
} cout << '\n';
}
너무 중요한 문제이므로 문제도 함께 첨부한다.
오늘은 떡볶이 떡을 만드는 날이다. 떡의 길이는 일정하지 않으므로 절단기에 높이(H)를 지정하고 잘라서 맞추려고 한다. 이때 자르고 남는 길이는 손님에게 주려고 한다.
예를 들어, 높이가 19, 14, 10, 17cm인 떡이 있고, 절단기 높이를 15cm로 가정하면 자르고 남는 떡의 길이는 4, 0, 0, 2cm이고 총 6cm이다. 손님은 6cm를 가져간다.
이때, 손님이 요청한 길이가 M일 때 적어도 M 만큼의 떡을 얻기 위해 절단기에 설정해야 하는 높이 H의 최댓값을 구하는 프로그램을 작성하시오.
( )
예제
<입력>
4 6
19 15 10 17
<출력>
15
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
static int N, M;
static vector<int> tteok;
int main() {
cin >> N >> M;
tteok = vector<int>(N);
for (int i = 0; i < N; ++i) cin >> tteok[i];
sort(begin(tteok), end(tteok)); // for binary search!
int left = 0, right = tteok[N - 1], mid;
while (left <= right) {
int tempSum = 0, mid = (left + right) / 2;
for (int i = 0; i < N; ++i) // 자를 수 있으면 값을 더해주고, 없으면 0.
tempSum += (tteok[i] - mid > 0) ? tteok[i] - mid : 0;
if (M == tempSum) { cout << mid << '\n'; break; }
else if (M < tempSum) left = mid + 1;
else right = mid - 1;
}
}
left
는 0, 최대범위 right
은 가장 긴 떡의 길이로 시작한다.mid
는 left + right
의 절반이며 이 값이 절단기의 높이가 된다.M
과 비교해서 일치하면 답을 출력하고, 작으면 right
을 줄여주고, 크면 left
를 늘려준다.