Algorithm

ํƒ์ƒ‰ | ์ˆœ์ฐจ ํƒ์ƒ‰, ์ด์ง„ ํƒ์ƒ‰, ๋ถ€ํ’ˆ ์ฐพ๊ธฐ

osean 2020. 11. 7. 01:14

์ˆœ์ฐจ ํƒ์ƒ‰ / ์ด์ง„ ํƒ์ƒ‰

์ˆœ์ฐจ ํƒ์ƒ‰

  • ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ํ•ญ์ƒ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ์ œ์ผ ์ฒ˜์Œ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” **O(N)** ์ด๋‹ค. (N = ๋ฐฐ์—ด์˜ ๊ธธ์ด)
  • (๋ญ”๊ฐ€ ๋ฒ„๋ธ” ์ •๋ ฌ๊ณผ ๋น„์Šทํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™๋‹ค.)

์ด์ง„ ํƒ์ƒ‰

  • ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์ „์ œ ํ•˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ์ด์šฉํ•ด ์ค‘๊ฐ„์ ์„ ์ฐพ๊ณ , ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ์ค‘๊ฐ„์ ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งž์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์ฆ‰, ์žฌ๊ท€ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ํƒ์ƒ‰์„ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ, ๋ฐฐ์—ด ๋‚ด ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ตœ์„ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋‹ˆ๋‹ค.

Lower / Upper Bound

  • ์ด์ง„ ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ตœ์„ ์ด์ง€๋งŒ, ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์ตœ์„ ์ด ๋  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด Lower / Upper Bound ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

Lower Bound

  • ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ฆ‰, Lower Bound๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ ์ดํ›„์— ๋ฐ์ดํ„ฐ๋Š” ๋ช‡ ๊ฐœ์ธ์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. (์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Upper Bound ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ๋‹ค.)
  • ๊ทธ๋Ÿฌํ•œ ์ด์œ ๋กœ ๋ฐ˜ํ™˜๋œ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ ์ด์ „์˜ ์ธ๋ฑ์Šค์—๋Š” ์ ˆ๋Œ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๋ฐฐ์—ด ๋‚ด์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋งŒ์•ฝ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฐ์—ด ๋‚ด์— ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Upper Bound

  • ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฐ์—ด ๋‚ด์—์„œ ๋ช‡ ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ชจ๋ฅด๋Š” Lower Bound ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • Upper Bound ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฐพ๊ณ ์ž ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ดˆ๊ณผ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

 

์ด์ง„ํƒ์ƒ‰-์ƒ/ํ•˜ํ•œ์„ ((lower bound,upper bound)

์ฃผ์–ด์ง„ ์ž๋ฃŒ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š์€ ๊ฐ’์ด ์ฃผ์–ด์งˆ ๋•Œ ๊ทธ ๋ฐ์ดํ„ฐ๋‚ด์— ํŠน์ • ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘  ์ด์ง„ํƒ์ƒ‰(Binary Search)์€ ์ž๋ฃŒ๋ฅผ ์ •๋ ฌํ•œํ›„ ๋ถ„ํ• ์ •๋ณต๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ 2/1์”ฉ ๋‚˜๋ˆ„๋ฉด์„œ ๊ฐ’

jackpot53.tistory.com

์ด์ง„ ํƒ์ƒ‰์„ ์‘์šฉํ•ด์„œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋ถ€ํ’ˆ ์ฐพ๊ธฐ - ์ด์ฝ”ํ…Œ

package ์‹ฌ์„ฑํ—Œ.์•Œ๊ณ ๋ฆฌ์ฆ˜_5์ฃผ์ฐจ.์ด์ฝ”ํ…Œ;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class ๋ถ€ํ’ˆ์ฐพ๊ธฐ_์ด์ฝ”ํ…Œ {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static int n, m;
    static int[] arr1, arr2;

    public static void main(String[] args) throws Exception {
        // N = ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜ / M = ๋‚ด๊ฐ€ ์ฐพ๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜
        // N ์ž…๋ ฅ
        n = Integer.parseInt(br.readLine());
        arr1 = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());

        int idx = 0;
        while (st.hasMoreTokens()) {
            arr1[idx] = Integer.parseInt(st.nextToken());
            idx++;
        }

        // M ์ž…๋ ฅ
        m = Integer.parseInt(br.readLine());
        arr2 = new int[m];
        st = new StringTokenizer(br.readLine());
        idx = 0;
        while (st.hasMoreTokens()) {
            arr2[idx] = Integer.parseInt(st.nextToken());
            System.out.print(find(arr1, 0, n - 1, arr2[idx]) + " ");
            idx++;
        }
    }

    public static String find(int[] arr, int start, int end, int target) {
        if (start > end) return "No";
        int mid = (start + end) / 2;
        if (arr[mid] == target) return "Yes";
        else if (arr[mid] > target) return find(arr, start, mid - 1, target);
        else return find(arr, mid + 1, end, target);
    }
}

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋น„๊ต์  ์‰ฝ๊ฒŒ(?) ํ’€ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
๋‹ค๋งŒ ์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ๋งˆ์ง€๋ง‰ ์ถœ๋ ฅ๊ฐ’์ด Yes ๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์ž๊พธ No ๋กœ ์ถœ๋ ฅ๋˜์–ด์„œ ์™œ ์ด๋Ÿฐ์ง€ ์ด์œ ๋ฅผ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฝค๋‚˜ ์†Œ์š”๋๋‹ค.

find ๋ฉ”์†Œ๋“œ๋Š” String ์ž๋ฃŒํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, else if ๊ตฌ๋ฌธ์—์„œ ์žฌ๊ท€๋กœ find ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ด๋†“๊ณ ์„œ๋Š” ์ด๊ฑธ return ํ•ด์ฃผ์ง€ ์•Š๋Š” ์ •๋ง ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์†Œ์š”๋๋‹ค. ๋งž๋‹ค. ๋‚˜ ๋ฐ”๋ณด๋‹ค.