백준 1920 수 찾기
2023. 6. 22. 17:05ㆍ코딩 공부 연습
반응형
오늘은 '이분 탐색' 문제를 풀었다.
그냥 for문을 돌면서 해당 수가 있는 곳을 범위를 절반씩 줄여가며 찾았다.
반복문을 돌면서 찾으면 쉽겠지만 시간초과가 날 것이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
int main()
{
int n, m;
vector<int> arr1;
vector<int> arr2;
int tmp;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> tmp;
arr1.push_back(tmp);
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> tmp;
arr2.push_back(tmp);
}
sort(arr1.begin(), arr1.end());
vector<int> answer;
for (int i = 0; i < m; i++)
{
int from, to;
int target = arr2[i];
from = 0;
to = n - 1;
// 이분 탐색으로 수를 찾는 부분
bool found = false; // 수를 찾았는지 여부를 저장할 변수 추가
while (from <= to) // 조건 변경: from <= to로 수정
{
int mid = (from + to) / 2;
if (arr1[mid] == target) // 수를 찾은 경우
{
found = true;
break;
}
else if (target < arr1[mid]) // 중간값보다 작은 경우
{
to = mid - 1;
}
else // 중간값보다 큰 경우
{
from = mid + 1;
}
}
if (found)
answer.push_back(1);
else
answer.push_back(0);
}
for (int i = 0; i < m; i++)
{
cout << answer[i] << "\n";
}
}
처음 풀었던 코드에선 mid 값 그대로 to, from 을 설정하여서 무한루프가 돌았다.
잘 신경쓰도록 하장!!
'코딩 공부 연습' 카테고리의 다른 글
백준 2309 일곱 난쟁이 (0) | 2023.07.16 |
---|---|
백준 18870 좌표 압축 (0) | 2023.06.23 |
백준 1057 토너먼트 (1) | 2023.06.20 |
백준 11000 강의실 배정 (1) | 2023.06.18 |
백준 1992 쿼드 트리 (0) | 2023.05.26 |