https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
문제 설명
집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.
이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.)
편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.
제한 조건
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다.
K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다.
랜선의 길이는 231-1보다 작거나 같은 자연수이다.
입출력 예
K, N | 이미 가지고 있는 각 랜선의 길이 | return |
4 11 | 802 743 457 539 |
200 |
answer
import sys
def solution():
K, N = map(int, input().split())
# sys.stdin.readline() 사용이유는 글 하단 참고
lan = [int(sys.stdin.readline()) for _ in range(K)]
min_value = 1 # 랜선의 최소 길이를 1로 설정
max_value = max(lan) # 랜선중 가장 긴 길이를 max값으로 설정
while min_value <= max_value: # 이분탐색이 완료될때까지 반복
mid = (min_value + max_value) // 2 # 이분탐색을 위한 중간값 설정
cnt = 0 # 랜선 수를 카운팅하는 변수 반복될때 마다 초기화 해야 하므로 반복문 안에서 선언
for i in lan:
cnt += i // mid # 랜선을 자른 수
if cnt >= N: # 랜선을 자른 수가 만들어야될 랜선의 수보다 클 경우
min_value = mid + 1 # 랜선의 최소 길이를 중간값보다 1크게 설정
else: # 랜선을 자른 수가 만들어야될 랜선의 수보다 작을 경우
max_value = mid - 1 # 랜선의 최대 길이를 중간값보다 1작게 설정
return max_value # 랜선을 자룬 수가 만들어야 될 랜선의 수와 같을경우 길이 출력
print(solution())
할말
참고
input()대신 sys.stdin.readline()을 사용하는 이유
- input() 내장 함수는 sys.stdin.readline()과 비교해서 prompt message를 출력하고, 개행 문자를 삭제한 값을 리턴하기 때문에 느리다.
- 한 두줄 입력받는 문제들과 다르게, 반복문으로 여러줄을 입력 받아야 할 때는 input()으로 입력 받는다면 시간초과가 발생할 수 있습니다.
참고 블로그
Input vs. sys.stdin.readline 차이점
[Python] Input vs. sys.stdin.readline 차이점?
Python으로 백준 문제를 풀 때 내장 함수 input()으로 입력을 받으면 시간 초과로 오답처리가 되고, sys 모듈의sys.stdin.readline()으로 입력을 받으면 시간 안에 채점이 되는 경우가 자주 발생한다. 왜 그
buyandpray.tistory.com
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)
파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.
velog.io
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2346번 풍선 터뜨리기(Python) (3) | 2021.08.29 |
---|