이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 2343(기타 레슨) - Python(파이썬) - 이분탐색

  • 2022.05.31 20:55
  • [백준] Python,Java로 풀기📖/이분탐색
    반응형
     

    2343번: 기타 레슨

    강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경

    www.acmicpc.net

    문제 접근

    조건 : 블루레이를 묶을 때는 같은 블루레이 사이에 다른 블루레이가 들어올 수 없으므로 연속되게 묶어야한다.

    ex ] 1번, 3번 같은 블루레이 -> 2번 같은 블루레이

     

    ① 블루레이의 크기가 15라고 할 경우 강의의 합이 15보다 작거나 같게 묶여야하므로

      1번 블루레이에는 (1,2,3,4,5),

      2번 블루레이에는 ( 6,7 )

      3번 블루레이에는 (8)

      4번 블루레이에는 (9) 

    이런식으로 묶이게 된다. 그렇게 되면 블루레이의 개수가 4개이므로 조건 3개보다 크므로 블루레이의 크기는 15보다 커야한다.

    1 2 3 4 5 6 7 8 9

    ② 블루레이의 크기가 27라고 할 경우 27보다 작거나 같게 묶여야하므로

      1번 블루레이에는 (1,2,3,4,5,6),

      2번 블루레이에는 ( 7,8,9 )

    이런식으로 묶이게 된다. 이 때는 블루레이의 개수가 2개이므로 조건 3개보다 작으므로 블루레이의 크기는 27보다 작아야한다.

    1 2 3 4 5 6 7 8 9

    ③ 이런식으로 늘리거나 줄이거나 할 때 이분 탐색을 이용하여서 구하다보면 블루레이의 크기가 17이라고 할 경우

      1번 블루레이에는 (1,2,3,4,5),

      2번 블루레이에는 (6,7),

      3번 블루레이에는 (8,9)

    이런식으로 묶일 수 있게 되어 블루레이의 개수가 3개이게 되므로 블루레이의 크기의 최솟값은 17(출력값)이 된다.

    1 2 3 4 5 6 7 8 9
    더보기
    더보기

    * 이진탐색 Tip

     - 이진탐색은 조건의 만족 여부 (Yes or No) 에 따라서 탐색 범위를 좁혀서 해결

     ex ] 블루레이의 개수가 3개인가 -> No 일경우 블루레이의 크기를 키우거나 작게 만들면 된다.

     - 큰 탐색 범위를 보면 가장 먼저 이진 탐색을 떠올리기


    풀이 방법

    ① 블루레이의 크기 설정

    강의의 길이 중 가장 Max인 값 9보다는 크거나 같아야하며 강의의 길이의 합 45보다는 작거나 같아야한다.

    ( 강의의 길이 Max(9) <= 블루레이의 크기 <= 강의의 길이의 합(1+2+3+4+5+6+7+8+9=45) )

     

    ② 블루레이의 크기를 가지고 이분 탐색을 한다. 왼쪽 = 9, 오른쪽 =45 -> 중간값 = (9+45)//2 =27로 설정

    이 때 나오는 블루레이의 개수를 세고 나서

    -> 블루레이의 개수가 조건(3)보다 크게 나올 경우에는 블루레이의 크기를 높여야하므로 28과 45 사이에 있다는 의미

    9   27 28 45

     -> 반면, 블루레이의 개수가 조건(3)보다 작게 나올 경우에는 블루레이의 크기를 작게해야하므로 9와 26 사이에 있다는 의미

    9 26 27   45

    따라서 블루레이의 개수가 클 경우에는 왼쪽 = 중간값 + 1 , 블루레이의 개수가 작을 경우에는 오른쪽 = 중간값 -1

    import sys
    n,m=map(int,sys.stdin.readline().split())
    array=list(map(int,sys.stdin.readline().split()))
    #블루레이의 크기 (강의의 길이 max <=블루레이의 크기 <= 강의의 길이 sum)
    left,right=max(array),sum(array)
    
    #이분 탐색 시작 left<=right인 경우
    while left<=right:
        #중간값
        mid=(left+right)//2
        #cnt값 1로 초기화
        cnt=1
        sum=0
        for i in range(n):
            #sum+array[i]의 값이 중간값보다 큰 경우
            if sum+array[i]>mid:
                #개수 증가,합 초기화
                cnt+=1
                sum=0
            #sum의 값 증가
            sum+=array[i]
    
        #블루레이의 개수가 조건보다 작을 경우
        if cnt<=m:
            right=mid-1
        #블루레이의 개수가 조건보다 클 경우
        else:
            left=mid+1
    
    print(left)
    반응형

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • TiL
    • 항해99
    • 티스토리챌린지
    • 오블완
    • 백준
    • 99클럽
    • 프로그래머스
    • 코딩테스트준비

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바