
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
문제 풀이
처음에는 algorithm의 sort()랑 find()를 이용해 답을 구하려 했는데 역시나 시간초과가 나왔다.
sort() 와 BinarySearch를 이용해서 풀려고 했는데 또 시간초과가 나왔다.
결국 MergeSort와 BinarySearch를 직접 구현해 문제를 해결하였다.
소스코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int N, M;
int A[100001];
int sorted[100001];
void merge(int start, int mid, int end) {
int i = start;
int j = mid + 1;
int k = start;
while (i <= mid && j <= end) {
if (A[i] <= A[j]) {
sorted[k] = A[i];
i++;
}
else if (A[i] > A[j]) {
sorted[k] = A[j];
j++;
}
k++;
}
if (i > mid) {
for (int t = j; t <= end; t++) {
sorted[k] = A[t];
k++;
}
}
else {
for (int t = i; t <= mid; t++) {
sorted[k] = A[t];
k++;
}
}
for (int t = start; t <= end; t++) {
A[t] = sorted[t];
}
}
void merge_sort(int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
merge_sort(start, mid);
merge_sort(mid + 1, end);
merge(start, mid, end);
}
}
bool binary_search(int num){
int s = 0;
int e = N - 1;
while (s <= e) {
int mid = (s + e) / 2;
if (num < A[mid]) {
e = mid - 1;
}
else if (num > A[mid]) {
s = mid + 1;
}
else {
return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
merge_sort(0, N - 1);
cin >> M;
for (int j = 0; j < M; j++) {
int b;
cin >> b;
bool find = binary_search(b);
if (find == true) {
cout << "1" << '\n';
}
else {
cout << "0" << '\n';
}
}
}
'알고리즘' 카테고리의 다른 글
[백준] 3055번 탈출 C++ 문제풀이 (0) | 2023.08.03 |
---|---|
[백준] 3425번 고스택 C++ 문제풀이 (0) | 2023.08.02 |
[백준] 2164번 카드2 C++ 문제 풀이 (0) | 2023.07.30 |
[백준] 11866번 요세푸스 문제 0 C++ 문제 풀이 (0) | 2023.07.25 |
[백준] 1181번 단어 정렬 C++ 문제 풀이 (1) | 2023.07.25 |