티스토리 뷰

Algorithm

이진탐색

Game Client Lee Hwanguk 2023. 1. 29. 15:30

#이진탐색이란?

이진 탐색이란 데이터가 정렬돼 있는 배열에서 특정한 값을 찾아내는 알고리즘이다. 배열의 중간에 있는 임의의 값을 선택하여 찾고자 하는 값 X와 비교한다. X가 중간 값보다 작으면 중간 값을 기준으로 좌측의 데이터들을 대상으로, X가 중간값보다 크면 배열의 우측을 대상으로 다시 탐색한다. 동일한 방법으로 다시 중간의 값을 임의로 선택하고 비교한다. 해당 값을 찾을 때까지 이 과정을 반복한다.

 

#언제써야할까?

=>연산횟수를 줄이기 위하여 사용

=>[BOJ] 1920 수찾기에서 완전탐색을 이용하면 시간초과가 나온다

찾아야하는 배열의 길이가 길수록 값을 찾는데 시간이 오래걸린다(ex for문-O(n),2중for문-O(n²)...)

2중for문으로는 시간초과를 해결할수없다 이진탐색(O(log n)을 이용하여 연산횟수를 줄여야한다

 

#빅O표기법?, 시간복잡도는?

https://dallae7.tistory.com/41

 

시간복잡도 O(logN) 빅오표기법

알고리즘의 효율성을 표기해주는 표기법으로 데이터가 n개 주어졌을 때 연산의 횟수를 나타낸다 빅오 표기법은 알고리즘 최악의 경우 복잡도를 나타낸다 간단하게 이진탐색을 예로 들어보자.

dallae7.tistory.com

=>이진탐색은 'O( log n)' 의 시간복잡도. 

->O( log n) =문제해결을위한 연산들이 단계마다 줄어듬.

 

#Lower Bound,Upper Bound

https://learn.microsoft.com/ko-kr/dotnet/api/system.array.getlowerbound?view=net-7.0 

 

Array.GetLowerBound(Int32) 메서드 (System)

배열에서 지정된 차원의 첫 번째 요소의 인덱스를 가져옵니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/dotnet/api/system.array.getupperbound?view=net-7.0 

 

Array.GetUpperBound(Int32) 메서드 (System)

배열에서 지정된 차원의 마지막 요소의 인덱스를 가져옵니다.

learn.microsoft.com

#이진탐색을 식으로 옴겨보자

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp13
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); //{1,3,5,7,9}                                                                         
            int N = arr.Length;
            int target = 3; //찾고자하는 값
            bool isTarget = false; //출력을 위한 bool
            //int index = -1;

            int low = 0;
            int high = N - 1;

            while (low < high)
            {
                int mid = (low + high) / 2; //mid값 설정
                if (arr[mid] == target) //mid 값과 target이 일치한다면? 찾았다면?
                {
                    isTarget = true;
                    //index = mid;
                    break;
                }
                if (arr[mid] > target)
                {
                    high = mid - 1; //high 값을 mid-1
                }
                else if (arr[mid] < target)
                {
                    low = mid + 1; //low값을 mid+1
                }
            }

            //결과값 출력
            if (isTarget) //=true
            {
                Console.WriteLine("target:{0}", target);
            }
            else
            {
                Console.WriteLine("no result");
            }



        }
    }
}

#입력받은 배열 arr={1,3,5,7,9} 에서 찾고싶은 값 target=3;

#mid값과 target값을 비교해가며 일치한다면(boll ->true) 출력

 

'Algorithm' 카테고리의 다른 글

[BOJ]2864 5와6의 차이  (0) 2023.02.09
알고리즘 ( .Split(); / int.Parse)  (0) 2023.01.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함