# μ„ ν˜•κ²€μƒ‰

written by sohyeon, hyemin πŸ’‘


# 1. μ„ ν˜•κ²€μƒ‰μ΄λž€?

λ°°μ—΄μ—μ„œ κ²€μƒ‰ν•˜λŠ” 방법 쀑 κ°€μž₯ 기본적인 μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.
μš”μ†Œκ°€ 직선 λͺ¨μ–‘μœΌλ‘œ λŠ˜μ–΄μ„  λ°°μ—΄μ—μ„œμ˜ 검색은
μ›ν•˜λŠ” ν‚€ 값을 κ°–λŠ” μš”μ†Œλ₯Ό λ§Œλ‚  λ•ŒκΉŒμ§€ 맨 μ•žλΆ€ν„° μˆœμ„œλŒ€λ‘œ μš”μ†Œλ₯Ό κ²€μƒ‰ν•˜λ©΄ λœλ‹€.
순차적으둜 μš”μ†Œλ₯Ό λ°©λ¬Έν•˜κΈ° λ•Œλ¬Έμ— μˆœμ°¨κ²€μƒ‰μ΄λΌκ³ λ„ ν•œλ‹€.

λ°°μ—΄μ—μ„œ κ°’ 2λ₯Ό μ„ ν˜•κ²€μƒ‰ν•˜λŠ” μ˜ˆμ‹œ

μœ„μ˜ 그림은 검색에 μ„±κ³΅ν•œ κ²½μš°μž…λ‹ˆλ‹€.

λ§Œμ•½ ν‚€ κ°’κ³Ό 같은 값을 가진 μš”μ†Œκ°€ 배열에 μ—†λ‹€λ©΄ 검색에 μ‹€νŒ¨ν•  것 이닀.
이 κ²½μš°μ—λ„ λ™μΌν•˜κ²Œ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό 맨 μ•žλΆ€ν„° μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜κ³ 
ν‚€ κ°’κ³Ό 같은 μš”μ†Œλ₯Ό λ§Œλ‚˜μ§€ λͺ»ν•œμ±„ λ°°μ—΄μ˜ 끝을 μ§€λ‚˜κ°€κ²Œ λœλ‹€.

# λ°°μ—΄ κ²€μƒ‰μ˜ μ’…λ£Œ 쑰건

  • 검색할 값을 λ°œκ²¬ν•˜μ§€ λͺ»ν•˜κ³  λ°°μ—΄μ˜ 끝을 μ§€λ‚˜κ°„ 경우
  • 검색할 κ°’κ³Ό 같은 μš”μ†Œλ₯Ό λ°œκ²¬ν•œ 경우

# μ˜ˆμ‹œ μ½”λ“œ

class SeqSearch{
    static int seqSearch(int[] a, int n, int key){
        for(int i=0; i<n; i++)
            if(a[i]==key)
                return i;
        return -1
    }

    public static void main(String[] args){
    Scanner stdIn = new Scanner(System.in);

    System.out.print("μš”μ†Ÿμˆ˜:" );
    int num = stdIn.nextInt();
    int[] x = new int[num];

    for(int i=0; i<num; i++){
        System.out.print("x["+i+"]:");
        x[i] = stdIn.nextInt();
    }
    System.out.print("검색할 κ°’:");
    int ky = stdIn.nextInt();
    
    int idx = seqSearch(x,num,ky);

    if(idx == -1)
        System.out.println("κ·Έ κ°’μ˜ μš”μ†Œκ°€ μ—†μŠ΅λ‹ˆλ‹€.");
    else
        System.out.println(ky+"은(λŠ”) x["+idx+"]에 μžˆμŠ΅λ‹ˆλ‹€.");
    }
}

# 2. λ³΄μ΄ˆλ²•

μ„ ν˜• 검색은 λ°˜λ³΅ν•  λ•Œλ§ˆλ‹€ μ’…λ£Œ 쑰건을 λͺ¨λ‘ νŒλ‹¨ν•©λ‹ˆλ‹€.
μ’…λ£Œ 쑰건을 κ²€μ‚¬ν•˜λŠ” λΉ„μš©μ„ λ¬΄μ‹œν•  수 μ—†κΈ° λ•Œλ¬Έμ—
이 λΉ„μš©μ„ 반으둜 μ€„μ΄λŠ” 방법이 λ³΄μ΄ˆλ²•μž…λ‹ˆλ‹€.

# λ³΄μ΄ˆλ²• μ˜ˆμ‹œ

검색을 μ‹œμž‘ν•˜κΈ° 전에 κ²€μƒ‰ν•˜κ³ μž ν•˜λŠ” ν‚€ 값을 맨 끝 μš”μ†Œμ— μ €μž₯ν•œλ‹€.
이 μ €μž₯ν•˜λŠ” 값을 보초(sentinel)라고 ν•œλ‹€.

보초 값을 ν™œμš©ν•˜λ―€λ‘œμ„œ μ›λž˜μ˜ 데이터에 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„λ„ λ³΄μ΄ˆκΉŒμ§€ κ²€μƒ‰ν•˜λ©΄ λ°°μ—΄ κ²€μƒ‰μ˜ μ’…λ£Œ 쑰건 쀑 검색할 값을 λ°œκ²¬ν•˜μ§€ λͺ»ν•˜κ³  λ°°μ—΄μ˜ 끝을 μ§€λ‚˜κ°„ 경우이 없어도 λœλ‹€.

λ³΄μ΄ˆλŠ” λ°˜λ³΅λ¬Έμ—μ„œ μ’…λ£Œ νŒλ‹¨ 횟수λ₯Ό 2νšŒμ—μ„œ 1회둜 μ€„μ΄λŠ” 역할을 ν•©λ‹ˆλ‹€.

# 예제 μ½”λ“œ

class SeqSearchSen{
    static int seqSearchSen(int[] a, int n, int key){
        int i=0;
        a[n]=key;   // 보초λ₯Ό μΆ”κ°€

        while(true){
            if(a[i]==key)   // 검색 성곡!
                break;
            i++;
        }
        return i == n ? -1 : i; // λ³€μˆ˜ i값이 n이면 찾은 값이 λ³΄μ΄ˆμ΄λ―€λ‘œ 검색 μ‹€νŒ¨μž„
    }

    public static void main(Stirng[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("μš”μ†Ÿμˆ˜:" );
        int num = stdIn.nextInt();
        int[] x = new int[num+1];

        for(int i=0; i<num; i++){
            System.out.print("x["+i+"]:");
            x[i] = stdIn.nextInt();
        }
        System.out.print("검색할 κ°’:");
        int ky = stdIn.nextInt();
        
        int idx = seqSearchSen(x,num,ky);   // λ°°μ—΄ xμ—μ„œ 값이 ky인 μš”μ†Œλ₯Ό 검색

        if(idx == -1)
            System.out.println("κ·Έ κ°’μ˜ μš”μ†Œκ°€ μ—†μŠ΅λ‹ˆλ‹€.");
        else
            System.out.println(ky+"은(λŠ”) x["+idx+"]에 μžˆμŠ΅λ‹ˆλ‹€.");
        }
    }
}
Last Updated: 12/5/2020, 11:36:44 AM