⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
이분탐색으로 문제를 해결합니다. 7월에는 블로그에 글을 안올렸지만, 사실 문제는 꾸준히 쉬운 레벨이여도 생소한 문제를 보면 바로 문제를 풀었습니다. 이 문제는 오랜만에 이분탐색을 풀면서 중복되는 값의 첫번째 값과 마지막 값을 구할 수 있다는 것을 처음 알았습니다(?) 이분 탐색 문제는 아주 오랜만에 풀어서 굉장히 시간이 오래걸렸습니다.
아래는 정답코드입니다. 이 문제는 추후에 다시 해결하면서 다시 이분탐색을 자유자재로 써볼 수 있게 구현해봐야겠습니다.
#include<iostream>
#include<algorithm>
#define MAX 100100
using namespace std;
// 끝과 끝일떄 문제 26168
int n,m;
long long board[MAX];
void init() {
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> board[i];
}
sort(board,board + n);
}
// k보다 크거나 같은
int binarySearch(long long findNumber) {
int startIdx = -1; int endIdx = n;
while(startIdx + 1 < endIdx){
int mid = (startIdx + endIdx) / 2;
if(board[mid] >= findNumber){
endIdx = mid;
} else {
startIdx = mid;
}
}
return endIdx;
}
int binarySearch2(long long findNumber) {
int startIdx = -1; int endIdx = n;
while(startIdx + 1 < endIdx){
int mid = (startIdx + endIdx) / 2;
if(board[mid] <= findNumber){
startIdx = mid;
} else {
endIdx = mid;
}
}
return endIdx;
}
void solve() {
int order;
long long k;
while(m--) {
cin >> order;
if(order == 1) {
cin >> k;
int start = binarySearch(k);
cout << n - start<< "\n";
} else if(order == 2) {
cin >> k;
int start = binarySearch(k + 1);
cout << n - start << "\n";
} else if(order == 3) {
long long s,e; cin >> s >> e;
int start = binarySearch(s);
int end = binarySearch2(e);
//cout << "end : " <<end << " " << "start : " <<start << "\n";
cout << end - start << "\n";
}
}
}
int main() {
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
init();
solve();
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[C++/22252] 정보 상인 호석 (0) | 2024.07.17 |
---|---|
[C++/27438] 행렬 연산 (0) | 2024.07.10 |
[C++/18115] 카드놓기 (0) | 2024.07.04 |
[C++/28066] 타노스는 요세푸스가 밉다. (0) | 2024.06.30 |
[C++/28256] 초콜릿 보관함 (0) | 2024.06.27 |