[백준] 1654번 : 랜선 자르기

James·2023년 7월 8일
0

코딩 테스트

목록 보기
6/41
post-thumbnail

문제

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

풀이

[백준] 1654 : 랜선 자르기 🥈(실버2)
🎯 정답률 :21.179%

<✅ 문제 요약>

  1. 랜선의 개수 K, 필요한 랜선의 개수 N
  2. 랜선을 필요로 하는 만큼 잘라야한다.
  3. 이미 자른 다른 랜선을 가져다 붙일 수 없다.
  4. 편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다.

<✅ 풀이방법 & 이진 탐색(Binary Search)으로 푼이유?>

1. 랜선은 합칠 수 없다.
2. 랜선을 나눌 수 있는 값을 가장 빠르게 탐색 할 수 있다. (시간복잡도 log(n))
3. start와 end 같이지면 멈추고 출력

코드(code)

import sys 
input = sys.stdin.readline
#K : 랜선의 개수, N: 필요한 랜선의 개수
K, N = map (int, input().split())
LanArr = [int(input()) for i in range(K)]
# 이진 탐색은 정렬이 되어있어야 한다.
LanArr.sort() 

start ,end =1, LanArr[K-1]
while start <= end:
    mid =  (start + end) //2
    lan_cnt = 0 # 랜선의 자르는 개수 총합

    for i in range(K):
        lan_cnt += LanArr[i]//mid
    	if lan_cnt >= N:
        	start = mid + 1
        elif lan_cnt < N:
            end = mid -1
    print(start,end)

# while문이 끝나고 나면 end 출력
print(end)

회고

이진탐색(Binary Search) 정말 빠르게 찾을 수 있다는 걸 느끼고,
코테 문제를 이진탐색으로 푼게 거의 없어서 알고리즘 이해가 올라간 느낌이다.
이진탐색 앞으로 나오면 잘 풀 수 있을듯 ?

profile
의미있는 성장의 태도, 긍정적인 사고를 지닌 Deveolper

0개의 댓글