1384: [탐색] 2진 탐색
[만든사람 : 2015 개정 교육과정 고등학교 정보과학 (주)삼양미디어]
문제 설명
정보과학 교과서 169p
----
2진 탐색(binary search)은 원하는 데이터를 찾기 위해서,
정렬되어있는 데이터들의 가운데 값을 반복적으로 찾아 비교하는 탐색 방법이다.
탐색이 한 번씩 진행될 때마다, 찾아보아야하는 데이터의 범위(개수)가 절반 씩 줄어들기 때문에 매우 빠른 탐색이 가능하다.
정렬되어있는 n개의 정수 데이터를 입력받아,
원하는 데이터가 저장된 위치를 찾는 2진탐색 프로그램을 작성해보자.
단, find() 등을 사용할 수 없다.
#include <stdio.h>
int n, d[100010], k, q, x;
int binary_search(int l, int r, int x)
{
if(l>r) return -1; //데이터 x를 못 찾은 경우 -1리턴
int m = (l+r)/2; //가운데 위치 m을 계산하고
if(d[m] == x) //가운데 위치에 찾는 데이터가 있으면, 해당 위치 리턴
return m;
else if(d[m] > x) //찾는 데이터보다 값이 크다면, 왼쪽 부분에 대해서 다시 탐색
return binary_search(l, m-1, x);
else //찾는 데이터보다 값이 작다면, 오른쪽 부분에 대해서 다시 탐색
return binary_search(m+1, r, x);
}
int main()
{
scanf("%d", &n); //데이터 개수 입력
for(int i=1; i<=n; i++) //데이터 입력
scanf("%d", &d[i]);
scanf("%d", &q); //쿼리 개수 입력
for(int i=1; i<=q; i++)
{
scanf("%d", &k);
printf("%d\n", binary_search(1, n, k)); //2진 탐색
}
}
----
2진 탐색(binary search)은 원하는 데이터를 찾기 위해서,
정렬되어있는 데이터들의 가운데 값을 반복적으로 찾아 비교하는 탐색 방법이다.
탐색이 한 번씩 진행될 때마다, 찾아보아야하는 데이터의 범위(개수)가 절반 씩 줄어들기 때문에 매우 빠른 탐색이 가능하다.
정렬되어있는 n개의 정수 데이터를 입력받아,
원하는 데이터가 저장된 위치를 찾는 2진탐색 프로그램을 작성해보자.
단, find() 등을 사용할 수 없다.
#include <stdio.h>
int n, d[100010], k, q, x;
int binary_search(int l, int r, int x)
{
if(l>r) return -1; //데이터 x를 못 찾은 경우 -1리턴
int m = (l+r)/2; //가운데 위치 m을 계산하고
if(d[m] == x) //가운데 위치에 찾는 데이터가 있으면, 해당 위치 리턴
return m;
else if(d[m] > x) //찾는 데이터보다 값이 크다면, 왼쪽 부분에 대해서 다시 탐색
return binary_search(l, m-1, x);
else //찾는 데이터보다 값이 작다면, 오른쪽 부분에 대해서 다시 탐색
return binary_search(m+1, r, x);
}
int main()
{
scanf("%d", &n); //데이터 개수 입력
for(int i=1; i<=n; i++) //데이터 입력
scanf("%d", &d[i]);
scanf("%d", &q); //쿼리 개수 입력
for(int i=1; i<=q; i++)
{
scanf("%d", &k);
printf("%d\n", binary_search(1, n, k)); //2진 탐색
}
}
입력 설명
첫 번째 줄에 데이터의 개수(n)가 입력된다.
두 번째 줄에는 서로 다른 n개의 정수 데이터(k)가 오름차순으로 스페이스를 사이에 두고 한 줄로 입력된다.
세 번째 줄에는 쿼리 개수(q)가 입력된다.
네 번째 줄부터 q개의 줄에 거쳐, 위치를 찾아야하는 데이터(x)가 한 줄에 1개씩 입력된다.
[1 <= n <= 100000]
[0 <= k <= 1000000]
[1 <= q <= 100000]
[0 <= x <= 1000000]
두 번째 줄에는 서로 다른 n개의 정수 데이터(k)가 오름차순으로 스페이스를 사이에 두고 한 줄로 입력된다.
세 번째 줄에는 쿼리 개수(q)가 입력된다.
네 번째 줄부터 q개의 줄에 거쳐, 위치를 찾아야하는 데이터(x)가 한 줄에 1개씩 입력된다.
[1 <= n <= 100000]
[0 <= k <= 1000000]
[1 <= q <= 100000]
[0 <= x <= 1000000]
출력 설명
q개의 데이터 x가 저장되어있는 위치를 한 줄에 1개씩 출력한다.
데이터 x를 찾을 수 없는 경우에는 -1을 출력한다.
데이터 x를 찾을 수 없는 경우에는 -1을 출력한다.
입력 예시 Copy
5
3 4 7 8 9
3
8
7
2
출력 예시 Copy
4
3
-1