김민쏭
REPOSITORY
김민쏭
전체 방문자
오늘
어제
  • 분류 전체보기 (69)
    • 원앙둥지 (17)
      • 2022 홋카이도 (6)
      • 2024 후쿠오카 (3)
    • 프로그래밍 (51)
      • 정리노트 (11)
      • Spring (5)
      • Javascript (7)
      • Database (7)
      • 알고리즘 (11)
      • 좋은글_갈무리 (3)
      • 기타 (3)

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
김민쏭

REPOSITORY

백준 알고리즘 1920번 : 수 찾기 (C++)
프로그래밍/알고리즘

백준 알고리즘 1920번 : 수 찾기 (C++)

2019. 10. 21. 14:16

 

이번 알고리즘 문제는 이진 탐색을 배울 수 있었다.

문제를 처음보고 내가 입력했던 방식은 이중 for문을 통해 찾는 것이었는데, 출력 값이 동일했음에도 시간 제한에 걸려 통과하지 못했다.

그래서 이것저것 검색해본 결과, 이진 탐색 기법을 이용해야 통과할 수 있다고 하였다.

 

이진 탐색은 이분 탐색이라고 불리기도 하는데, 연속된 값 중 정가운데 값을 뽑아

그 값보다 큰지, 작은지를 비교하여 탐색하는 기법이다.

 

출처 : https://medium.com/@codingfreak/binary-search-practice-problems-4c856cd9f26c

투박한 이미지이지만, 전체를 2등분해 찾는 방법을 가장 쉽게 표현한 이미지 같아 첨부하였다.

 

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<iostream>
#include<algorithm>
using namespace std;
 
void BinarySearch(int *arr, int start, int end, int searchNum){
     // 반복문을 통한 이진 탐색 
    int mid;
    
    while(end - start >= 0){
        mid = (start+end)/2;
        
        if(arr[mid] == searchNum){
            printf("1 \n");
            return;
        }else if(arr[mid] > searchNum){
            end = mid - 1;
        }else { // arr[mid] < searchNum
            start = mid + 1;
        }
    }
    
    printf("0 \n");
    return;
    
}
 
/*
void BinarySearch(int *arr, int start, int end, int searchNum){
    // 재귀를 통한 이진 탐색
    int mid;
    
    if(start > end){
        printf("0 \n");
        return;
    }else{
        
        mid = (start+end) / 2;
        
        if(arr[mid] > searchNum){
            return BinarySearch(arr, start, mid - 1, searchNum);
        }else if(arr[mid] < searchNum){
            return BinarySearch(arr, mid + 1, end, searchNum);
        }else{
            printf("1 \n");
            return;
        }
        
    }
    
}
*/
 
int main() {
    
    // https://www.acmicpc.net/problem/1920
    
    int n,m;
    scanf("%d", &n);
    
    int nArr[n];
    
    for(int i=0; i<n; i++)
        scanf("%d", &nArr[i]);
        
    sort(nArr, nArr + n ); 
// sort 함수를 이용해 오름차순 정렬. sort(배열의 시작점 '주소', 배열의 마지막점 '주소');
    
    scanf("%d", &m);
    
    int tmp;
    int end = sizeof(nArr)/sizeof(nArr[0]);
        
    for(int i=0; i<m; i++){
        scanf("%d",&tmp);
        BinarySearch(nArr, 0, end, tmp);
    }
}
Colored by Color Scripter
cs

 

C++ 에서 이진 탐색을 구현하는 방법에는 직접 구현하는 방법과 C++ STL의 binary_search 함수를 이용하는 방법이 있다.

나는 이진 탐색의 기본이 없기 때문에, 검색하여 직접 구현하는 방법을 찾아 사용하였다.

사실상 보고 치는거나 다름없다. 그래도 찬찬히 배워서 정리해두는게 좋을 것 같다.

 

참고 - 

개발자 지망생님 블로그 : 
https://blockdmask.tistory.com/166
https://blockdmask.tistory.com/167

저작자표시 (새창열림)

'프로그래밍 > 알고리즘' 카테고리의 다른 글

백준 알고리즘 1009번 : 분산처리 (C++, JAVA)  (0) 2019.10.21
백준 알고리즘 1920번 : 수 찾기 (JAVA)  (0) 2019.10.21
백준 알고리즘 1037번 : 약수 (JAVA)  (0) 2019.10.19
백준 알고리즘 1032번 : 명령 프롬프트 (JAVA)  (0) 2019.10.19
백준 알고리즘 1026번 : 보물 (JAVA)  (0) 2019.10.19
    '프로그래밍/알고리즘' 카테고리의 다른 글
    • 백준 알고리즘 1009번 : 분산처리 (C++, JAVA)
    • 백준 알고리즘 1920번 : 수 찾기 (JAVA)
    • 백준 알고리즘 1037번 : 약수 (JAVA)
    • 백준 알고리즘 1032번 : 명령 프롬프트 (JAVA)
    김민쏭
    김민쏭
    예예,,,저장소임더,,,

    티스토리툴바