ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Binary Search] BOJ 2110 ๊ณต์œ ๊ธฐ ์„ค์น˜
    Algorithms in Python/baekjoon 2021. 1. 24. 14:51

     

    ๐ŸŽˆ ๋ฐฑ์ค€ 2110 ๊ณต์œ ๊ธฐ ์„ค์น˜

    ๋ฌธ์ œ

    ๋„ํ˜„์ด์˜ ์ง‘ N๊ฐœ๊ฐ€ ์ˆ˜์ง์„  ์œ„์— ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ง‘์˜ ์ขŒํ‘œ๋Š” x1, ..., xN์ด๊ณ , ์ง‘ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๊ฐ™์€ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๋Š” ์ผ์€ ์—†๋‹ค.

    ๋„ํ˜„์ด๋Š” ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์™€์ดํŒŒ์ด๋ฅผ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•ด์„œ ์ง‘์— ๊ณต์œ ๊ธฐ C๊ฐœ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณณ์—์„œ ์™€์ดํŒŒ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ์ง‘์—๋Š” ๊ณต์œ ๊ธฐ๋ฅผ ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•œ ํฌ๊ฒŒ ํ•˜์—ฌ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

    C๊ฐœ์˜ ๊ณต์œ ๊ธฐ๋ฅผ N๊ฐœ์˜ ์ง‘์— ์ ๋‹นํžˆ ์„ค์น˜ํ•ด์„œ, ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

    ์ž…๋ ฅ

    ์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์œ ๊ธฐ์˜ ๊ฐœ์ˆ˜ C (2 ≤ C ≤ N)์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ง‘์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

    ์ถœ๋ ฅ

    ์ฒซ์งธ ์ค„์— ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

     


    โ— ๋ฌธ์ œ์˜ ํ•ต์‹ฌ, ํ’€์ด ๊ณผ์ •

    • ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ์ตœ๋Œ€๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

    => ๊ฐ ์ง‘์˜ ์ขŒํ‘œ์˜ ํƒ์ƒ‰๋ฒ”์œ„๊ฐ€ 1,000,000,000 (ํฐ ํƒ์ƒ‰๋ฒ”์œ„ -> ์ด์ง„ํƒ์ƒ‰์„ ๋– ์˜ฌ๋ฆฐ๋‹ค)

         - ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด์ง„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

         - start: ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๊ธฐ์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ(1), end: ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๊ธฐ์˜ ์ตœ๋Œ€๊ฑฐ๋ฆฌ(arr[-1] - arr[0])

         - mid ๊ฐ’์„ ์ด์šฉํ•ด ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

     

    • ๊ณต์œ ๊ธฐ๋Š” ์ง‘์— ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด C๊ฐœ๋ฅผ ์„ค์น˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

    => ํƒ์ƒ‰๊ณผ์ •์—์„œ C๊ฐœ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

         - C๊ฐœ ์ด์ƒ์˜ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. 

            -> ๊ฑฐ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•œ๋‹ค. (start = mid + 1)

         - C๊ฐœ ์ด์ƒ์˜ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

            -> ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์•ผ ํ•œ๋‹ค. (end = mid - 1)

     

    โœ… ์ „์ฒด ์ฝ”๋“œ

    import sys
    input = sys.stdin.readline
    
    n, c = map(int, input().split())
    
    arr = [0] * n
    for i in range(n):
        arr[i] = int(input())
    
    arr.sort()
    
    # ์ตœ๋Œ€ ์ตœ์†Œ ๊ฑฐ๋ฆฌ(๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ gap)
    start = 1   # ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ
    end = arr[-1] - arr[0]  # ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ
    result = 0
    
    while start <= end:
        mid = (start + end) // 2
        val = arr[0]
        cnt = 1     # ๋งจ ์ฒ˜์Œ ๊ณต์œ ๊ธฐ
    
        # ๊ณต์œ ๊ธฐ ์•ž์—์„œ๋ถ€ํ„ฐ ์„ค์น˜
        for i in range(1, n):
            if arr[i] >= val + mid:
                val = arr[i]
                cnt += 1
    
        # c๊ฐœ์ด์ƒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
        if cnt >= c:    # ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ gap ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
            start = mid + 1
            result = mid
        else:   # ์„ค์น˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ gap์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
            end = mid - 1
    
    print(result)

     

     

    * ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ - ๋‚˜๋™๋นˆ

    ๋Œ“๊ธ€

Designed by Tistory.