본문 바로가기
알고리즘(C언어)/알고리즘 및 실습 강의

(8)실습6주차_이진탐색+순차자료_[문제3](작성중)

by 코잼민 2024. 9. 11.

※문제 PDF는 다음 링크에 들어가면 다운받을 수 있다.

https://kojammin.tistory.com/95

 

(6)실습6주차_이진탐색+순차자료_[문제1]

[문제1]##이진탐색_순차자료(배열)_노트 :이론 : 시간복잡도 : O(logN)   ##코드 : 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include stdio.h>#include stdlib.h>#pragma warnin

kojammin.tistory.com

 

#문제 핵심 힌트 :

힌트1 _ 위의 힌트를 봤을 때, 'N'을 입력 시, mid의 범위를 포함하고, 'Y'를 입력mid의 범위포함하지 않는다.

  • 일반적인 이분 탐색 범위 나눌 때, 

A[mid] 와 Key와 비교 후, => Start - mid -1 (왼쪽 구간)|| mid + 1 - End(오른쪽구간)

즉,  mid를 포함하지 않고, 왼쪽 오른쪽 구간을 나눈다.

  •  이 문제의 이분탐색 범위 나눌 때,

A[mid] 와 Key와 비교 후, => Start - mid (왼쪽 구간, 'N'입력 시)|| mid + 1 - End(오른쪽구간,'Y'입력 시)

즉, mid를 N일 때, 포함한다. (이유 :위의 사진의 문제 힌트 때문)

힌트2 _ 마지막 반환 값을 End(끝 범위)||Start(시작 범위) 값으로 한다.

##입력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
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
 
void BinarySearch(int start, int endint cnt) {
    if (cnt == 0) {
        // 종료 조건: cnt가 0이 되면 탐색이 끝났으므로 결과 출력
        printf("%d\n"end);
        return;
    }
 
    int mid = (start + end/ 2;
    char tmp;
 
    // 한 문자 입력 ('Y' 또는 'N')
    scanf(" %c"&tmp);
 
    // 입력에 따라 범위를 나누어 재귀 호출
    if (tmp == 'Y') {
        BinarySearch(mid + 1end, cnt - 1);  // 'Y'면 오른쪽 범위 탐색
    }
    else {
        BinarySearch(start, mid, cnt - 1);  // 'N'면 왼쪽 범위 탐색
    }
}
 
int main() {
    int start, end, cnt;
    scanf("%d %d %d"&start, &end&cnt);
 
    // 이진 탐색 재귀 호출
    BinarySearch(start, end, cnt);
 
    return 0;
}
 
cs