코테 노트/백준
백준 1654 랜선 자르기 Python 3
화요밍
2022. 1. 20. 18:20
728x90
반응형
https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
최종 코드
GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음
백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.
github.com
import sys
def get_length(K, N, lans):
left = 1
right = max(lans)
answer = 0
while left <= right:
mid = (left+right)//2
cnt = 0
for lan in lans:
cnt += (lan//mid)
if cnt >= N:
answer = mid
left = mid+1
else:
right = mid-1
return answer
input = sys.stdin.readline
K, N = map(int, input().split())
lans = list()
for _ in range(K):
lans.append(int(input()))
print(get_length(K, N, lans))
풀이 과정
풀이 시간 10분
길이가 각각 다른 K개의 랜선을 잘라서 N개의 길이가 같은 랜선을 만들 때 그 길이가 최대인 경우를 찾는 문제이다.
따라서, 자를 랜선의 길이를 기준으로 이분 탐색 알고리즘을 적용할 수 있다.
import sys
def get_length(K, N, lans):
#자를 랜선의 길이의 범위 초기화 -> 랜선의 길이는 1부터 K개의 랜선 중 가장 길이가 긴 랜선의 길이만큼 자를 수 있다
left = 1
right = max(lans)
answer = 0
#이분 탐색
while left <= right:
#자를 랜선의 길이를 mid로 가정
mid = (left+right)//2
#mid 길이의 랜선의 개수 카운트
cnt = 0
#K개의 랜선을 mid 길이로 자른다
for lan in lans:
cnt += (lan//mid)
#mid 길이의 랜선이 N개 이상인 경우,
if cnt >= N:
#mid를 answer로 갱신한다
answer = mid
#더 긴 길이로 자를 수 있을지 탐색하기 위해 left 범위를 늘린다
left = mid+1
#mid 길이의 랜선이 N개 미만인 경우,
else:
#mid보다 자를 길이가 작아야하므로 right 범위를 줄인다
right = mid-1
return answer
input = sys.stdin.readline
K, N = map(int, input().split())
lans = list()
for _ in range(K):
lans.append(int(input()))
print(get_length(K, N, lans))
#시간복잡도 = O(log n), 공간복잡도 = O(n)
728x90
반응형