[πŸ“šμ΄μ½”ν…Œ #4] 이진 탐색 πŸ”₯

졜호빈·2023λ…„ 5μ›” 2일
0
post-thumbnail

좜처 : https://www.youtube.com/watch?v=94RC-DsGMLo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=5


πŸ“Œ 이진 탐색 μ•Œκ³ λ¦¬μ¦˜


  • 순차 탐색 : 리슀트 μ•ˆμ— μžˆλŠ” νŠΉμ •ν•œ 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ•žμ—μ„œλΆ€ν„° 데이터λ₯Ό ν•˜λ‚˜μ”© ν™•μΈν•˜λŠ” 방법

  • 이진 탐색: μ •λ ¬λ˜μ–΄ μžˆλŠ” λ¦¬μŠ€νŠΈμ—μ„œ 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” 방법
    πŸ‘‰πŸ» λ¦¬μŠ€νŠΈκ°€ μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό 함
    πŸ‘‰πŸ» 이진 탐색은 μ‹œμž‘μ , 끝점, 쀑간점을 μ΄μš©ν•˜μ—¬ 탐색 λ²”μœ„λ₯Ό μ„€μ •
    πŸ‘‰πŸ» λΉ λ₯΄κ²Œ 탐색 κ°€λŠ₯ν•˜μ—¬ 둜그 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§ˆ 수 있음


πŸ€“ 이진 탐색 λ™μž‘ μ˜ˆμ‹œ


이미 μ •λ ¬λœ 10개의 데이터 쀑 값이 4인 μ›μ†Œλ₯Ό μ°ΎλŠ” μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž

STEP 1 : μ‹œμž‘ 인덱슀 : 0, 쀑간 인덱슀 : 4 (μ†Œμˆ˜μ  μ΄ν•˜ 제거), 끝 인덱슀 : 9
βœ… 쀑간점과 λΉ„κ΅ν•˜μ—¬ μž‘μœΌλ―€λ‘œ 쀑간점 λ―Έλ§Œμ—μ„œλ§Œ 탐색. 즉, 쀑간점 이상 μΈλ±μŠ€λŠ” λ³Ό ν•„μš” ❌
βœ… κ°™μœΌλ©΄ 탐색 μ™„λ£Œ ⭕️
βœ… 쀑간점 μœ„μΉ˜λ₯Ό μ™Όμͺ½μœΌλ‘œ 이동

STEP 2 : μ‹œμž‘ 인덱슀 : 0, 쀑간 인덱슀 : 1 (μ†Œμˆ˜μ  μ΄ν•˜ 제거), 끝 인덱슀 : 3
βœ… 쀑간점과 λΉ„κ΅ν•˜μ—¬ ν¬λ―€λ‘œ 쀑간점 μ΄ˆκ³Όμ—μ„œλ§Œ 탐색. 즉, 쀑간점 μ΄ν•˜ μΈλ±μŠ€λŠ” λ³Ό ν•„μš” ❌
βœ… κ°™μœΌλ©΄ 탐색 μ™„λ£Œ ⭕️
βœ… μ‹œμž‘μ  μœ„μΉ˜λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동

STEP 3 : μ‹œμž‘ 인덱슀 : 2, 쀑간 인덱슀 : 2 (μ†Œμˆ˜μ  μ΄ν•˜ 제거), 끝 인덱슀 : 3
βœ… μ‹œμž‘μ κ³Ό 쀑간점이 κ°™μœΌλ―€λ‘œ 탐색 μ™„λ£Œ
βœ… 찾고자 ν•˜λŠ” κ°’ 4κ°€ 인덱슀 2에 μœ„μΉ˜ν•œλ‹€λŠ” 것을 μ•Œμ•„λƒ„


🀯 μ‹œκ°„ λ³΅μž‘λ„ 뢄석

βœ… λ‹¨κ³„λ§ˆλ‹€ 탐색 λ²”μœ„λ₯Ό 2둜 λ‚˜λˆ„λŠ” 것과 λ™μΌν•˜λ―€λ‘œ μ—°μ‚° νšŸμˆ˜λŠ” logN에 λΉ„λ‘€
βœ… 예λ₯Ό λ“€μ–΄ 초기 데이터 κ°œμˆ˜κ°€ 32개일 λ•Œ, μ΄μƒμ μœΌλ‘œ 1단계λ₯Ό 거치면 16κ°œκ°€λŸ‰μ˜ λ°μ΄ν„°λ§Œ, 2단계λ₯Ό 거치면 8κ°œκ°€λŸ‰μ˜ λ°μ΄ν„°λ§Œ, 3단계λ₯Ό 거치면 4κ°œκ°€λŸ‰μ˜ λ°μ΄ν„°λ§Œ λ‚¨λŠ”λ‹€.
βœ… λ‹€μ‹œ 말해 이진 탐색은 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© 쀄이며, μ‹œκ°„ λ³΅μž‘λ„λŠ” O(logN)을 보μž₯ν•œλ‹€.


[μž¬κ·€μ  κ΅¬ν˜„] 이진 탐색 μ†ŒμŠ€μ½”λ“œ

python

# 이진 탐색 μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„ (μž¬κ·€ ν•¨μˆ˜)
def binary_search(array, target, start, end):
    if start > end:
        return None
    mid = (start + end) // 2
    # 찾은 경우 쀑간점 인덱슀 λ°˜ν™˜
    if array[mid] == target:
        return mid
    # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 μ™Όμͺ½ 확인
    elif array[mid] > target:
        return binary_search(array, target, start, mid - 1)
    # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 큰 경우 였λ₯Έμͺ½ 확인
    else:
        return binary_search(array, target, mid + 1, end)

# n(μ›μ†Œμ˜ 개수)κ³Ό target(찾고자 ν•˜λŠ” κ°’)을 μž…λ ₯ λ°›κΈ°
n, target = list(map(int, input().split()))
# 전체 μ›μ†Œ μž…λ ₯ λ°›κΈ°
array = list(map(int, input().split()))

# 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
else:
    print(result + 1)

Java

import java.util.*;

public class Main {

    // 이진 탐색 μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„(μž¬κ·€ ν•¨μˆ˜)
    public static int binarySearch(int[] arr, int target, int start, int end) {
        if (start > end) return -1;
        int mid = (start + end) / 2;
        // 찾은 경우 쀑간점 인덱슀 λ°˜ν™˜
        if (arr[mid] == target) return mid;
        // μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 μ™Όμͺ½ 확인
        else if (arr[mid] > target) return binarySearch(arr, target, start, mid - 1);
        // μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 큰 경우 였λ₯Έμͺ½ 확인
        else return binarySearch(arr, target, mid + 1, end);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        // μ›μ†Œμ˜ 개수(n)와 찾고자 ν•˜λŠ” κ°’(target)을 μž…λ ₯λ°›κΈ° 
        int n = sc.nextInt();
        int target = sc.nextInt();

        // 전체 μ›μ†Œ μž…λ ₯λ°›κΈ° 
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        // 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯ 
        int result = binarySearch(arr, target, 0, n - 1);
        if (result == -1) {
            System.out.println("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
        }
        else {
            System.out.println(result + 1);
        }
    }
}

[반볡문 κ΅¬ν˜„] 이진 탐색 μ†ŒμŠ€μ½”λ“œ

python

# 이진 탐색 μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„ (반볡문)
def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        # 찾은 경우 쀑간점 인덱슀 λ°˜ν™˜
        if array[mid] == target:
            return mid
        # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 μ™Όμͺ½ 확인
        elif array[mid] > target:
            end = mid - 1
        # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 큰 경우 였λ₯Έμͺ½ 확인
        else:
            start = mid + 1
    return None

# n(μ›μ†Œμ˜ 개수)κ³Ό target(찾고자 ν•˜λŠ” κ°’)을 μž…λ ₯ λ°›κΈ°
n, target = list(map(int, input().split()))
# 전체 μ›μ†Œ μž…λ ₯ λ°›κΈ°
array = list(map(int, input().split()))

# 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
else:
    print(result + 1)

Java

import java.util.*;

public class Main {

    // 이진 탐색 μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„(반볡문)
    public static int binarySearch(int[] arr, int target, int start, int end) {
        while (start <= end) {
            int mid = (start + end) / 2;
            // 찾은 경우 쀑간점 인덱슀 λ°˜ν™˜
            if (arr[mid] == target) return mid;
            // μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 μ™Όμͺ½ 확인
            else if (arr[mid] > target) end = mid - 1;
            // μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 큰 경우 였λ₯Έμͺ½ 확인
            else start = mid + 1; 
        }
        return -1;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
   
        // μ›μ†Œμ˜ 개수(n)와 찾고자 ν•˜λŠ” κ°’(target)을 μž…λ ₯λ°›κΈ° 
        int n = sc.nextInt();
        int target = sc.nextInt();

        // 전체 μ›μ†Œ μž…λ ₯λ°›κΈ° 
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        // 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯ 
        int result = binarySearch(arr, target, 0, n - 1);
        if (result == -1) {
            System.out.println("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
        }
        else {
            System.out.println(result + 1);
        }
    }
}



πŸ“• 파이썬 이진 탐색 라이브러리


bisect_left(a, x) : μ •λ ¬λœ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ λ°°μ—΄ a에 xλ₯Ό μ‚½μž…ν•  κ°€μž₯ μ™Όμͺ½ 인덱슀λ₯Ό λ°˜ν™˜
bisect_right(a, x) : μ •λ ¬λœ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ λ°°μ—΄ a에 Xλ₯Ό μ‚½μž…ν•  κ°€μž₯ 였λ₯Έμͺ½ 인덱슀λ₯Ό λ°˜ν™˜

βœ… C++μ—μ„œ bisect_left(a, x)λŠ” lower_bound, bisect_right(a, x)λŠ” upper_bound와 λ™μΌν•˜λ‹€.
βœ… 값이 μ•„λ‹Œ 인덱슀λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이닀!

python

from bisect import bisect_left, bisect_right

a = 11, 2, 4, 4, 8]
x = 4

print(bisect_left(a, x))
print(bisect_right(a, x))

μ‹€ν–‰κ²°κ³Ό :
2
4


πŸ€” 값이 νŠΉμ •λ²”μœ„μ— μ†ν•˜λŠ” 데이터 개수 κ΅¬ν•˜κΈ°

python

from bisect import bisect_left, bisect_right

# 값이 [left value, right_ valuel인 λ°μ΄ν„°μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
def count_by_range(a, left_value, right_value):
	right_index = bisect_right(a, right_value)
	left_index = bisect_left(a, left_value)
	return right_index - left_index

# λ°°μ—΄ μ„ μ–Έ
a= [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]

# 값이 4인 데이터 개수 좜λ ₯
print(count_by_range(a, 4, 4))

# 값이 [-1, 3] λ²”μœ„μ— μžˆλŠ” 데이터 개수 좜λ ₯
print(count_by_range(a, -1, 3))

μ‹€ν–‰κ²°κ³Ό :
2
6


  • νŒŒλΌλ©”νŠΈλ¦­ μ„œμΉ˜λž€ μ΅œμ ν™” 문제λ₯Ό κ²°μ • 문제('예' ν˜Ήμ€ μ•„λ‹ˆμ˜€')둜 λ°”κΎΈμ–΄ ν•΄κ²°ν•˜λŠ” 기법

μ˜ˆμ‹œ: νŠΉμ •ν•œ 쑰건을 λ§Œμ‘±ν•˜λŠ” κ°€μž₯ μ•Œλ§žμ€ 값을 λΉ λ₯΄κ²Œ μ°ΎλŠ” μ΅œμ ν™” 문제
βœ… 일반적으둜 μ½”λ”© ν…ŒμŠ€νŠΈμ—μ„œ νŒŒλΌλ©”νŠΈλ¦­ μ„œμΉ˜ λ¬Έμ œλŠ” 이진 탐색을 μ΄μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€.




βœ”οΈ [μ‹€μŠ΅] 떑볢이 λ–‘ λ§Œλ“€κΈ° 🍑

μ μ ˆν•œ 높이λ₯Ό 찾을 λ•ŒκΉŒμ§€ 이진 탐색을 μˆ˜ν–‰ν•˜μ—¬ 높이 Hλ₯Ό λ°˜λ³΅ν•΄μ„œ μ‘°μ •ν•˜λ©΄ λœλ‹€

βœ… 'ν˜„μž¬ 이 λ†’μ΄λ‘œ 자λ₯΄λ©΄ 쑰건을 λ§Œμ‘±ν•  수 μžˆλŠ”κ°€?'λ₯Ό ν™•μΈν•œ 뒀에 쑰건의 만쑱 μ—¬λΆ€('예' ν˜Ήμ€ 'μ•„λ‹ˆμ˜€)에 λ”°λΌμ„œ 탐색 λ²”μœ„λ₯Ό μ’ν˜€μ„œ ν•΄κ²°ν•  수 μžˆλ‹€.
βœ… μ ˆλ‹¨κΈ°μ˜ λ†’μ΄λŠ” 0λΆ€ν„° 10μ–΅κΉŒμ§€μ˜ μ •μˆ˜ 쀑 ν•˜λ‚˜. μ΄λ ‡κ²Œ 큰 탐색 λ²”μœ„λ₯Ό 보면 κ°€μž₯ λ¨Όμ € 이진 탐색을 λ– μ˜¬λ €μ•Ό ν•œλ‹€.


λ¬Έμ œμ—μ„œ μ œμ‹œλœ μ˜ˆμ‹œλ₯Ό 톡해 그림으둜 이해해 보자


STEP 1 : μ‹œμž‘ 인덱슀: 0, 쀑간 인덱슀: 9, 끝 인덱슀: 19

βœ… μ΄λ•Œ ν•„μš”ν•œ λ–‘μ˜ 크기 : M = 6, 잘린 λ–‘μ˜ κΈΈμ΄λŠ” 25μ΄λ―€λ‘œ κ²°κ³Ό μ €μž₯
βœ… λ–‘μ˜ 크기λ₯Ό λ§Œμ‘±ν•˜λ―€λ‘œ 쀑간 인덱슀λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동 (즉, 자λ₯΄λŠ” κ°’μ˜ 크기λ₯Ό 늘림)


STEP 2 : μ‹œμž‘ 인덱슀: 10, 쀑간 인덱슀: 14, 끝 인덱슀: 19

βœ… μ΄λ•Œ ν•„μš”ν•œ λ–‘μ˜ 크기 : M = 6, 잘린 λ–‘μ˜ κΈΈμ΄λŠ” 9μ΄λ―€λ‘œ κ²°κ³Ό μ €μž₯
βœ… λ–‘μ˜ 크기λ₯Ό λ§Œμ‘±ν•˜λ―€λ‘œ 쀑간 인덱슀λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동 (즉, 자λ₯΄λŠ” κ°’μ˜ 크기λ₯Ό 늘림)


STEP 3 : μ‹œμž‘ 인덱슀: 15, 쀑간 인덱슀: 17, 끝 인덱슀: 19

βœ… μ΄λ•Œ ν•„μš”ν•œ λ–‘μ˜ 크기 : M = 6, 잘린 λ–‘μ˜ κΈΈμ΄λŠ” 2μ΄λ―€λ‘œ κ²°κ³Ό μ €μž₯ν•˜μ§€ μ•ŠμŒ
βœ… λ–‘μ˜ 크기λ₯Ό λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ 쀑간 인덱슀λ₯Ό μ™Όμͺ½μœΌλ‘œ 이동 (즉, 자λ₯΄λŠ” κ°’μ˜ 크기λ₯Ό μ€„μž„)


STEP 4 : μ‹œμž‘ 인덱슀: 15, 쀑간 인덱슀: 15, 끝 인덱슀: 16

βœ… μ΄λ•Œ ν•„μš”ν•œ λ–‘μ˜ 크기 : M = 6, 잘린 λ–‘μ˜ κΈΈμ΄λŠ” 6μ΄λ―€λ‘œ κ²°κ³Ό μ €μž₯
βœ… λ–‘μ˜ 크기λ₯Ό λ§Œμ‘±ν•˜κ³  μ‹œμž‘ μΈλ±μŠ€μ™€ 쀑간 μΈλ±μŠ€κ°€ κ°™μœΌλ―€λ‘œ 인덱슀 리턴



python

# λ–‘μ˜ 개수(N)와 μš”μ²­ν•œ λ–‘μ˜ 길이(M)을 μž…λ ₯
n, m = list(map(int, input().split(' ')))
# 각 λ–‘μ˜ κ°œλ³„ 높이 정보λ₯Ό μž…λ ₯
array = list(map(int, input().split()))

# 이진 탐색을 μœ„ν•œ μ‹œμž‘μ κ³Ό 끝점 μ„€μ •
start = 0
end = max(array)

# 이진 탐색 μˆ˜ν–‰ (반볡적)
result = 0
while(start <= end):
    total = 0
    mid = (start + end) // 2
    for x in array:
        # μž˜λžμ„ λ•Œμ˜ 떑볢이 μ–‘ 계산
        if x > mid:
            total += x - mid
    # 떑볢이 양이 λΆ€μ‘±ν•œ 경우 더 많이 자λ₯΄κΈ° (였λ₯Έμͺ½ λΆ€λΆ„ 탐색)
    if total < m:
        end = mid - 1
    # 떑볢이 양이 μΆ©λΆ„ν•œ 경우 덜 자λ₯΄κΈ° (μ™Όμͺ½ λΆ€λΆ„ 탐색)
    else:
        result = mid # μ΅œλŒ€ν•œ 덜 μž˜λžμ„ λ•Œκ°€ μ •λ‹΅μ΄λ―€λ‘œ, μ—¬κΈ°μ—μ„œ result에 기둝
        start = mid + 1

# μ •λ‹΅ 좜λ ₯
print(result)

Java

import java.util.*;

public class Main {

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

        // λ–‘μ˜ 개수(N)와 μš”μ²­ν•œ λ–‘μ˜ 길이(M)
        int n = sc.nextInt();
        int m = sc.nextInt();

        // 각 λ–‘μ˜ κ°œλ³„ 높이 정보 
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        // 이진 탐색을 μœ„ν•œ μ‹œμž‘μ κ³Ό 끝점 μ„€μ •
        int start = 0;
        int end = (int) 1e9;
        // 이진 탐색 μˆ˜ν–‰ (반볡적)
        int result = 0; 
        while (start <= end) {
            long total = 0;
            int mid = (start + end) / 2;
            for (int i = 0; i < n; i++) {
                // μž˜λžμ„ λ•Œμ˜ λ–‘μ˜ μ–‘ 계산
                if (arr[i] > mid) total += arr[i] - mid; 
            }
            if (total < m) { // λ–‘μ˜ 양이 λΆ€μ‘±ν•œ 경우 더 많이 자λ₯΄κΈ°(μ™Όμͺ½ λΆ€λΆ„ 탐색)
                end = mid - 1;
            }
            else { // λ–‘μ˜ 양이 μΆ©λΆ„ν•œ 경우 덜 자λ₯΄κΈ°(였λ₯Έμͺ½ λΆ€λΆ„ 탐색)
                result = mid; // μ΅œλŒ€ν•œ 덜 μž˜λžμ„ λ•Œκ°€ μ •λ‹΅μ΄λ―€λ‘œ, μ—¬κΈ°μ—μ„œ result에 기둝 
                start = mid + 1;
            }
        }
        System.out.println(result);
    }
}

πŸ€— μ΄λŸ¬ν•œ 이진 탐색 과정을 λ°˜λ³΅ν•˜λ©΄ 닡을 λ„μΆœν•  수 μžˆλ‹€.
μ€‘κ°„μ μ˜ 값은 μ‹œκ°„μ΄ μ§€λ‚ μˆ˜λ‘ μ΅œμ ν™”λœ 값이 되기 λ•Œλ¬Έμ—, 과정을 λ°˜λ³΅ν•˜λ©΄μ„œ 얻을 수 μžˆλŠ” λ–‘μ˜ 길이 합이 ν•„μš”ν•œ λ–‘μ˜ 길이보닀 ν¬κ±°λ‚˜ 같을 λ•Œλ§ˆλ‹€ 쀑간 인덱슀의 값을 κΈ°λ‘ν•˜λ©΄ λœλ‹€.



βœ”οΈ [μ‹€μŠ΅] μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ • 수의 개수 κ΅¬ν•˜κΈ° πŸ”’


βœ… μ‹œκ°„ λ³΅μž‘λ„ O(logN)으둜 λ™μž‘ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μš”κ΅¬
βœ… 일반적인 μ„ ν˜• 탐색(Linear Search)λ‘œλŠ” μ‹œκ°„ 초과 νŒμ •μ„ λ°›λŠ”λ‹€.
βœ… ν•˜μ§€λ§Œ 데이터가 μ •λ ¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— 이진 탐색을 μˆ˜ν–‰ν•  수 μžˆλ‹€.
βœ… νŠΉμ • 값이 λ“±μž₯ν•˜λŠ” 첫 번째 μœ„μΉ˜μ™€ λ§ˆμ§€λ§‰ μœ„μΉ˜λ₯Ό μ°Ύμ•„ μœ„μΉ˜ 차이λ₯Ό 계산해 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.


python (ꡐ재.ver)

from bisect import bisect_left, bisect_right

# 값이 [left_value, right_value]인 λ°μ΄ν„°μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
def count_by_range(array, left_value, right_value):
    right_index = bisect_right(array, right_value)
    left_index = bisect_left(array, left_value)
    return right_index - left_index

n, x = map(int, input().split()) # λ°μ΄ν„°μ˜ 개수 N, 찾고자 ν•˜λŠ” κ°’ x μž…λ ₯ λ°›κΈ°
array = list(map(int, input().split())) # 전체 데이터 μž…λ ₯ λ°›κΈ°

# 값이 [x, x] λ²”μœ„μ— μžˆλŠ” λ°μ΄ν„°μ˜ 개수 계산
count = count_by_range(array, x, x)

# 값이 x인 μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄
if count == 0:
    print(-1)
# 값이 x인 μ›μ†Œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄
else:
    print(count)

python (μ§œμ™•.ver)

from bisect import bisect_left, bisect_right

n, x = map(int, (input().split()))
arr = list(map(int, input().split()))

result = bisect_right(arr, x) - bisect_left(arr, x)

print(result if result > 0 else "-1")

Java

import java.util.*;

public class Main {

    public static int lowerBound(int[] arr, int target, int start, int end) {
        while (start < end) {
            int mid = (start + end) / 2;
            if (arr[mid] >= target) end = mid;
            else start = mid + 1;
        }
        return end;
    }

    public static int upperBound(int[] arr, int target, int start, int end) {
        while (start < end) {
            int mid = (start + end) / 2;
            if (arr[mid] > target) end = mid;
            else start = mid + 1;
        }
        return end;
    }

    // 값이 [left_value, right_value]인 λ°μ΄ν„°μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
    public static int countByRange(int[] arr, int leftValue, int rightValue) {
        // 유의: lowerBound와 upperBoundλŠ” end λ³€μˆ˜μ˜ 값을 λ°°μ—΄μ˜ 길이둜 μ„€μ •
        int rightIndex = upperBound(arr, rightValue, 0, arr.length);
        int leftIndex = lowerBound(arr, leftValue, 0, arr.length);
        return rightIndex - leftIndex;
    }

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

        // λ°μ΄ν„°μ˜ 개수 N, 찾고자 ν•˜λŠ” κ°’ x μž…λ ₯λ°›κΈ°
        int n = sc.nextInt();
        int x = sc.nextInt();

        // 전체 데이터 μž…λ ₯λ°›κΈ°
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
 
        // 값이 [x, x] λ²”μœ„μ— μžˆλŠ” λ°μ΄ν„°μ˜ 개수 계산
        int cnt = countByRange(arr, x, x);
  
        // 값이 x인 μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄
        if (cnt == 0) System.out.println(-1);
        //  값이 x인 μ›μ†Œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄
        else System.out.println(cnt);
    }
}
profile
λ°±μ—”λ“œ 병아리 πŸ₯

0개의 λŒ“κΈ€