문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
정수가 존재하는지 확인만 하면 되기에, 탐색 문제라고 생각했다. 이분 탐색으로 접근해서 풀었는데 바로 성공한 문제이다. 그리고 mid를 구하는 코드부분에서 start+end / 2의 부분에서 연산자 우선순위를 고려하지 않고 코드를 짜서 디버깅할 때 헤매었다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
int n_array[100001];
int m_array[100001];
int binary_search(int start, int end, int target)
{
int mid = 0;
int result = 0;
while (start <= end) {
mid = (start + end) / 2; //연산자 우선순위 신경안써서 mid값이 이상하게 나왔음. 아니.. 이런 실수를..
if (n_array[mid] == target) return 1;
else if (n_array[mid] > target) end = mid - 1;
else if (n_array[mid] < target) start = mid + 1;
}
return result;
}
int main()
{
int n, m, temp = 0;
int result = 0;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &n_array[i]);
}
//이분 탐색을 위한 배열정렬
sort(n_array, n_array + n);
cin >> m;
for (int i = 0; i < m; i++) {
scanf("%d", &m_array[i]);
}
//수 찾기
for (int i = 0; i < m; i++) {
result = binary_search(0, n-1, m_array[i]); //end값으로 n을 넘겨도 맞았지만, n-1로 보내야 정확.
printf("%d\n", result);
}
return 0;
}
연산자 우선순위를 활용한 괄호 꼭 작성하기!
'역시 내 문제해결 알고리즘은 잘못됐다 > 이분 탐색' 카테고리의 다른 글
백준 2805번 나무 자르기 [C/C++] (0) | 2021.02.28 |
---|---|
백준 1654번 랜선 자르기 [C/C++] (0) | 2021.02.24 |