일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- HTML
- CSS
- 윈도우즈
- windows
- API
- function
- query
- System
- Sort
- java
- C
- CLASS
- 악성코드
- meta
- 노드
- WebProgramming
- beans
- array
- jsp
- OOP
- JavaScript
- request
- Kafka
- 자료구조
- c++
- Call-by-reference
- UTF-8
- algorithm
- 투자
- 포인터
- Today
- Total
hahahia
binary search(이진 탐색) 본문
정렬된 수열을 입력으로 받아 이 수열내에 찾고자 하는 수가 있는지 없는지를 구하는 프로그램을 작성하시오.
입력
입력의 첫 수는 검색 대상이 되는 수의 개수 n ( 1 <= n <= 500,000 ) 이고 , 다음 n 개의 수 와 검색대상 수가 입력으로 주어진다. 주어지는 수열의 수와 검색되상의 수는 정수 범위를 넘지 않고 , 입력되는 첫 수가 첫번째 수이다.출력
찾으면 몇 번째 있는 수인지를 출력하고 찾고자 하는 데이터가 없으면 "not found" 를 출력한다.입출력 예
입력
5
2 4 6 8 10
4
출력
2
입력
5
2 4 6 8 10
5
출력
not found
출처 | dovelet
정렬된 데이터라고 가정할 때 logN번으로 가장 효과적으로 특정한 데이터를 찾아내는 알고리즘 기법을 binary search(이진탐색)이라고 합니다. 사실은 이 기법은 업다운게임(?)을 생각해보면 쉽게 이해하실 수 있습니다. 업다운게임도 결국에는 연속된 수들을 기준으로 외치는 숫자보다 크면 업! 작으면 다운!을 외치면서 값을 찾아내기 때문이죠.
소스코드를 보시면 쉽게 이해가능 합니다.
/*
made by hahahia
binary.cpp
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int data[500001];
int main(){
int n, left, right, center, num;
cin >> n;
center = n/2;
for(int i=0; i<n; i++) // input data
cin >> data[i];
cin >> num; // search number
left = 0;
right = n-1;
while(1)
{
center = (left + right)/2;
if(data[center] < num)
left = center + 1;
else if(data[center] > num)
right = center - 1;
else if(data[center] == num)
{
cout << center+1 << endl; // found number. and program exit
return 0;
}
if(left > right) break;
}
cout << "not found" << endl; // not found
return 0;
}
'Algorithm' 카테고리의 다른 글
파스칼의 삼각형 소스코드 (0) | 2015.05.16 |
---|---|
Heap Sort(힙 정렬) 구현 (2) | 2012.11.13 |
c++ string을 이용한 2진수에서 10진수 변환 프로그램 (2) | 2012.10.04 |
더블릿 문제풀이(최대 구간 구하기) (0) | 2012.10.04 |
쉬프트 연산( << , >> ) (0) | 2012.09.01 |