Algorithm Study/Python

[백준 파이썬] # 1654 랜선 자르기

728x90
반응형

Silver III

# 1654 랜선 자르기

링크 : https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

풀이

K, N = map(int, input().split())
lan = [int(input()) for i in range(K)]

def bs(arr, target):
    start = 1  # zerodivisionerror 방지, 0 → 1
    end = max(lan)

    while start <= end:
        mid = (start+end) // 2
        cnt = 0  # cnt: while문 안에서 작동하도록 할 것

        for i in lan:
            cnt += i // mid

        if cnt >= target:  
            start = mid + 1
        else:
            end = mid - 1

    return end

print(bs(lan, N))

 

후기

  • cnt를 while문 밖에 넣었던 바람에 작동 오류가 있었다. cnt 위치에 주의할 것
  • zerodivisionerror가 발생했었다. start를 0이 아닌 1로 설정해서 문제없이 해결할 수 있었다
  • cnt, target의 케이스를 세 개(<, ==, >)로 나누지 않고 두 개(>=, <)으로 나누는 이유에 대해서 아직 이해하지 못했다. **