Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ง•๊ฒ€๋‹ค๋ฆฌ

deo2kim 2020. 9. 13. 20:59
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

Lv4 | ์ด๋ถ„ ํƒ์ƒ‰

 

๋”ฑ ๋ณด์ž๋งˆ์ž ์ด๋ถ„ํƒ์ƒ‰์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ ์นดํ…Œ๊ณ ๋ฆฌ์— ์จ์žˆ๋‹ค.

 

์ด๋ถ„ํƒ์ƒ‰์„ ํ•˜๋ ค๋ฉด ์–ด๋–ค ๊ฐ’์„ ์™”๋‹ค ๊ฐ”๋‹ค ์ด๋ถ„ํƒ์ƒ‰ํ• ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋‹ต์œผ๋กœ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ์ตœ๋Œ“๊ฐ’์„ ์ด๋ถ„ํƒ์ƒ‰ ํ–ˆ๋‹ค.

 

  • ๋จผ์ € ๋‹ต์„ ์ •ํ•ด๋†“๊ณ  ์‹œ์ž‘ํ•œ๋‹ค. 0๊ณผ ๋งˆ์ง€๋ง‰ ์ง€์ ์ธ distance(25)๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ€์šด๋ฐ ๊ฐ’์œผ๋กœ 12๋กœ ์ •ํ–ˆ๋‹ค.
  • ์ด ๋ฌธ์ œ์— ๋‹ต์ด 12๋ผ๋ฉด ๋ฐ”์œ„๋ฅผ n๊ฐœ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๊ฐ€ 12์ธ ๋…€์„์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ฒ˜์Œ ์œ„์น˜๋ฅผ 0์œผ๋กœ ๋‘๊ณ  ๋‹ค์Œ ๋ฐ”์œ„๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ mid(12) ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ œ๊ฑฐ ์•„๋‹ˆ๋ฉด ๊ทธ ๋ฐ”์œ„๋กœ ์ด๋™
  • 0 ์—์„œ 2 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 2 < 12 : ์ œ๊ฑฐ
  • 0 ์—์„œ 11 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 11 < 12: ์ œ๊ฑฐ
  • 0 ์—์„œ 14 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 14 > 12: ์‚ด๋ ค๋‘  and 14๋กœ ์ด๋™
  • 14 ์—์„œ 17 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 3 < 12: ์ œ๊ฑฐ
  • 14 ์—์„œ 21 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 7 < 12: ์ œ๊ฑฐ
  • 14 ์—์„œ 25 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ 11 < 12: ์ œ๊ฑฐ

๋‹ต์ด 12๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ

  • ํ•˜์ง€๋งŒ ์ œ๊ฑฐํ•œ ๋ฐ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฏ€๋กœ ๊ธฐ์ค€๊ฐ’์„ ์ค„์—ฌ๋ณด์ž
  • right = mid - 1
  • (left + right) // 2 = 5

๋งˆ์ง€๋ง‰ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฐ”์œ„๊ฐ€ n๊ฐœ ์ œ๊ฑฐ ๋์„ ๋•Œ  ์ตœ์†Ÿ๊ฐ’ ์ด 4 ๋ผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

๋‹ต์„ 4๋กœ ๊ฐ€์ •ํ•ด ๋†“๊ณ  n ๊ณผ 4๋ฅผ ์–ป์—ˆ์œผ๋ฏ€๋กœ ์กฐ๊ฑด์— ๋งž๋Š”๋‹ค.

 

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

def solution(distance, rocks, n):
    answer = 0
    
    rocks.sort()  # ์ง•๊ฒ€๋‹ค๋ฆฌ ์ •๋ ฌ
    rocks.append(distance)  # ๋งˆ์ง€๋ง‰ ๋„์ฐฉ์ง€์™€์˜ ๊ฑฐ๋ฆฌ๊นŒ์ง€ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด
    
    left, right = 0, distance  # ์ด๋ถ„ ํƒ์ƒ‰ ์Šคํƒ€ํŠธ!
    while left <= right:
        # ๋‚˜๋Š” ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ mid๋กœ ์žก๊ฒ ๋‹ค!(๊ฑฐ๋ฆฌ๊ฐ€ mid ์ดํ•˜์ด๋ฉด ๋‹ค ์—†์•ค๋‹ค!)
        mid = (left + right) // 2  
        min_distance = float('inf')  # ๊ฐ mid ์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•  ๋…€์„
        current = 0  # ํ˜„์žฌ ์œ„์น˜
        remove_cnt = 0  # ๋ฐ”์œ„๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐœ์ˆ˜
        
        # ๊ฑฐ๋ฆฌ ์žฌ๊ธฐ ์Šคํƒ€ํŠธ
        for rock in rocks:
            diff = rock - current  # ๋ฐ”์œ„์™€ ํ˜„์žฌ ์œ„์น˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ
            if diff < mid:  # mid ๋ณด๋‹ค ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์œผ๋ฉด ๋ฐ”์œ„ ์ œ๊ฑฐ
                remove_cnt += 1
            else:  # mid ๋ณด๋‹ค ๊ฑฐ๋ฆฌ๊ฐ€ ๊ธธ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๋ฐ”์œ„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ 
                current = rock  # ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ทธ ๋ฐ”์œ„๋กœ ์˜ฎ๊ธฐ๊ณ 
                min_distance = min(min_distance, diff)  # ํ•ด๋‹น mid ๋‹จ๊ณ„์—์„œ์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ์ธ์ง€ ์ฒดํฌ
        
        # mid๋ฅผ ์„ค์ •ํ•˜๋Š” ๋‹จ๊ณ„
        if remove_cnt > n:  # ๋ฐ”์œ„๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ œ๊ฑฐ ํ–ˆ๋‹ค. mid๋ฅผ ์ค„์—ฌ์„œ ๋ฐ”์œ„๋ฅผ ์กฐ๊ธˆ๋งŒ ์ œ๊ฑฐํ•˜์ž
            right = mid - 1
        else:  # ๋ฐ”์œ„๋ฅผ ๋„ˆ๋ฌด ์ ๊ฒŒ ์ œ๊ฑฐํ–ˆ๋‹ค and ๋”ฑ ๋งž๋‹ค. mid๋ฅผ ๋Š˜๋ ค์„œ ๋ฐ”์œ„๋ฅผ ๋” ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ mid์˜ ์ตœ๋Œ“๊ฐ’์„ ์˜ฌ๋ ค๋ณด์ž
            answer = min_distance
            left = mid + 1

    return answer


print(solution(25, [2, 14, 11, 21, 17], 2))

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/43236?language=python3

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ง•๊ฒ€๋‹ค๋ฆฌ

์ถœ๋ฐœ์ง€์ ๋ถ€ํ„ฐ distance๋งŒํผ ๋–จ์–ด์ง„ ๊ณณ์— ๋„์ฐฉ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ์‚ฌ์ด์—๋Š” ๋ฐ”์œ„๋“ค์ด ๋†“์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์œ„ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์ฐฉ์ง€์ ์ด 25๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๊ณ , ๋ฐ”์œ„๊ฐ€

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

์ถœ๋ฐœ์ง€์ ๋ถ€ํ„ฐ distance๋งŒํผ ๋–จ์–ด์ง„ ๊ณณ์— ๋„์ฐฉ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ์‚ฌ์ด์—๋Š” ๋ฐ”์œ„๋“ค์ด ๋†“์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์œ„ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์ฐฉ์ง€์ ์ด 25๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๊ณ , ๋ฐ”์œ„๊ฐ€ [2, 14, 11, 21, 17] ์ง€์ ์— ๋†“์—ฌ์žˆ์„ ๋•Œ ๋ฐ”์œ„ 2๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ถœ๋ฐœ์ง€์ , ๋„์ฐฉ์ง€์ , ๋ฐ”์œ„ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ๊ฑฐํ•œ ๋ฐ”์œ„์˜ ์œ„์น˜ ๊ฐ ๋ฐ”์œ„ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’
[21, 17] [2, 9, 3, 11] 2
[2, 21] [11, 3, 3, 8] 3
[2, 11] [14, 3, 4, 4] 3
[11, 21] [2, 12, 3, 8] 2
[2, 14] [11, 6, 4, 4] 4

์œ„์—์„œ ๊ตฌํ•œ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’ ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์€ 4์ž…๋‹ˆ๋‹ค.

์ถœ๋ฐœ์ง€์ ๋ถ€ํ„ฐ ๋„์ฐฉ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ distance, ๋ฐ”์œ„๋“ค์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด rocks, ์ œ๊ฑฐํ•  ๋ฐ”์œ„์˜ ์ˆ˜ n์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฐ”์œ„๋ฅผ n๊ฐœ ์ œ๊ฑฐํ•œ ๋’ค ๊ฐ ์ง€์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’ ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๋„์ฐฉ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ distance๋Š” 1 ์ด์ƒ 1,000,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋ฐ”์œ„๋Š” 1๊ฐœ ์ด์ƒ 50,000๊ฐœ ์ดํ•˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • n ์€ 1 ์ด์ƒ ๋ฐ”์œ„์˜ ๊ฐœ์ˆ˜ ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

distance rocks n return
25 [2, 14, 11, 21, 17] 2 4

 

๋ฐ˜์‘ํ˜•