[백준 1654 랜선 자르기][파이썬] Parametric Search (이분 탐색) 접근 방법

2023. 3. 11. 12:00·백준 알고리즘/이진 탐색
728x90

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

백준 1654번 문제는 이분 탐색을 이용하는 Parametric Search의 기본적인 문제이다.

 

Parametric Search를 사용하기 위해서는 문제를 결정 문제로 바꿀 수 있어야 한다.

 

위 문제의 경우 자를 랜선의 길이를 임의로 x라고 했을 때 랜선 N개를 만들 수 있다면 True를, 없다면 False를 반환하는 문제로 바뀌게 된다.

 

그러면 이제 x의 최대 길이를 구하기 위해 이분 탐색을 사용할 수 있다.

 

위 문제에서 예제 입력 1번을 예시로 든다면 우선 low를 1로, high를 가장 긴 랜선의 길이인 802로 정한다.

 

그리고 이 중간 값인 mid는 401이 될 것이고 mid 길이 만큼 자를 때 랜선 N개를 만들 수 있다면 mid보다 더 크게 잘라도 되는지를 확인해야 하기 때문에 low에 mid+1 값을 넣어서 반한다.

 

만약 만들 수 없다면 그 보다 더 짧게 잘라야 하므로 high에 mid-1 값을 넣어서 반복한다.

 

그러다 high가 low보다 작아지는 순간에 반복을 멈춘다.

 

시간 복잡도를 계산해보면 우선 랜선 N개를 만들 수 있는지 판단할 때의 시간 복잡도는 O(N)이다.

 

현재 가지고 있는 모든 랜선에 대해서 각각 mid로 나눈 값(소숫점 버림)을 모두 더해서 N과 비교하면 되기 때문이다.

 

그리고 가장 최대 길이를 찾기 위한 과정은 이분 탐색으로 진행되기 때문에 시간 복잡도는 O(log N)이다.

 

즉 전체 시간 복잡도는 O( N log( N ) )이 된다.

 

import sys
input=sys.stdin.readline
k, n = map(int, input().split())
li=[0]*k
for i in range(k):
    li[i]=int(input())
standard = max(li)
res=0
def binary(low, high):
    if high<low:
        return
    global n
    global res
    mid=(low+high)//2
    temp=0
    for i in li:
        temp+=i//mid
    if temp>=n:
        res=mid   
        binary(mid+1, high)
    else:
        binary(low, mid-1)
binary(0, standard*2)
print(res)
728x90

'백준 알고리즘 > 이진 탐색' 카테고리의 다른 글

[백준 1300][파이썬] K번째 수  (0) 2023.03.03
[백준 2110][파이썬] 공유기 설치  (0) 2023.03.02
'백준 알고리즘/이진 탐색' 카테고리의 다른 글
  • [백준 1300][파이썬] K번째 수
  • [백준 2110][파이썬] 공유기 설치
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    binary search
    code tree
    ci/cd
    influxDB CLI
    embedding
    nn.RNN
    Vector Store
    openvidu 배포
    codetree
    parametric search
    bfs
    ChatPromptTemplate
    Merge
    스택
    파이썬
    스프링 OAuth2
    RNN
    AWS Lambda
    푸쉬 알람
    다익스트라
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[백준 1654 랜선 자르기][파이썬] Parametric Search (이분 탐색) 접근 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.