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
이분탐색을 공부하기 위해 가장 기본이 되는 예제를 풀었다.
이분탐색
left, right, mid 값으로 탐색 mid = (left + right)/2
이분 탐색 수행 방법
1. 배열을 이미 정렬해야 함 (여기서는 오름차순으로 언급할 예정)
2. left, right로 미드값 설정 mid = (left + right)/2
3. mid값과 구하고자 하는 값(A)을 비교해
3-1) 구하고자 하는 값이 mid보다 큰 경우(A>mid) : left = mid + 1;
3-2) 구하고자 하는 값이 mid보다 작은 경우(A<mid) right = mid -1;
위 과정을 left>right 가 될 때까지 반복, 구하고자 하는 값을 구할 때 까지 반복
이분탐색은 탐색 시간이 한 루프랑 반씩 줄어드므로 O(log(n))
아래 블로그에서 내용을 이해하고 작성하였다.
https://wootool.tistory.com/62
[알고리즘] 이분 탐색
이분 탐색 탐색 기법중에 하나로 원하는 탐색범위를 두 부분으로 분할해서 찾는 방식입니다. 그렇기에 원래의 전부를 탐색하는 탐색 속도에 비해 빠릅니다. 이분 탐색을 하는 방법은 left , right
wootool.tistory.com
<정답 작성 코드>
#include <iostream>
#include <algorithm>
using namespace std;
int A[100001];
int N, M;
int num, left ,right, mid;
int main() {
// cin, cout 속도 줄이기 위한 코드 - 해당 문제는 시간초과나는 경우 빈번
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//N과 배열A 입력 받기
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
//배열A 정렬하기 (오름차순)
sort(A, A + N);
//M입력받기
cin >> M;
//찾을 수 M번 입력 받기
for (int i = 0; i < M; i++) {
cin >> num;
bool is_success = false;
int left = 0, right = N-1;
int mid;
//left가 right보다 커지지 않을 때까지 반복. 즉, 이분탐색이 끝날 때까지 반복
while (left <= right) {
//mid값 설정
mid = (left + right) / 2;
// A[mid] 값이 찾는 수와 같을 경우 - 성공 표시
if (A[mid] == num) {
is_success = true;
break;
}
// A[mid] 값이 찾는 수보다 클 경우 - right 재정의
else if (num < A[mid]) {
right = mid - 1;
}
// A[mid] 값이 찾는 수보다 작을 경우 - left 재정의
else {
left = mid + 1;
}
}
cout << is_success << "\n";
}
return 0;
}
처음에는 A[mid]와 num의 비교가 아닌, 멍청하게도 mid와 num비교로 답을 구하고 있어서 계속 틀렸다. 이거 못 찾았으면 열받아서 잠 못 잘 뻔...
근데 더 화나는 건 자꾸 시간 초과나서 자꾸 틀렸다... 나 말고도 이 문제에서 시간초과 나는 사람이 많았는데 대부분
endl -> "\n" 변경
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 추가
로 해결한 듯 하다.
문제 한번 더럽게 까다롭네...
'CodingTest Practice > BOJ (Baekjoon Online Judge)' 카테고리의 다른 글
백준 2252 : 줄 세우기 (C++, 위상정렬) (0) | 2022.06.07 |
---|---|
백준 7562 : 나이트의 이동 (C++, BFS) (0) | 2021.12.22 |
백준 2003 : 수들의 합 2 (C++, 투포인터 알고리즘 기초) (0) | 2021.12.11 |
백준 10026 : 적록색약 (C++ , BFS) (0) | 2021.12.08 |
백준 1012 : 유기농 배추 (C++, BFS) (2) | 2021.12.07 |