새소식

Computer Science/코딩테스트 문제 풀이

[백준] [파이썬] [이분탐색] [결정알고리즘] 16401번: 과자 나눠주기

  • -

문제집 추천, 이 문제집에 나온 유형들만 공부해도 코딩테스트는 거뜬: https://www.acmicpc.net/workbook/by/BaaaaaaaaaaarkingDog

 

16401번: 과자 나눠주기 문제 보러 가기

문제

명절이 되면, 홍익이 집에는 조카들이 놀러 온다. 떼를 쓰는 조카들을 달래기 위해 홍익이는 막대 과자를 하나씩 나눠준다.

조카들이 과자를 먹는 동안은 떼를 쓰지 않기 때문에, 홍익이는 조카들에게 최대한 긴 과자를 나눠주려고 한다.
그런데 나눠준 과자의 길이가 하나라도 다르면 조카끼리 싸움이 일어난다. 따라서 반드시 모든 조카에게 같은 길이의 막대 과자를 나눠주어야 한다.

 

M명의 조카가 있고 N개의 과자가 있을 때, 조카 1명에게 줄 수 있는 막대 과자의 최대 길이를 구하라.

단, 막대 과자는 길이와 상관없이 여러 조각으로 나눠질 수 있지만, 과자를 하나로 합칠 수는 없다. 단, 막대 과자의 길이는 양의 정수여야 한다.

입력

첫째 줄에 조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다.

둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN ≤ 1,000,000,000) 를 만족한다.

출력

첫째 줄에 조카 1명에게 줄 수 있는 막대 과자의 최대 길이를 출력한다.

단, 모든 조카에게 같은 길이의 막대과자를 나눠줄 수 없다면, 0을 출력한다.

예제 입력 1

3 10
1 2 3 4 5 6 7 8 9 10

예제 출력 1

8

예제 입력 2

4 3
10 10 15

예제 출력 2

7


계속 틀림 또는 런타임 에러가 발생했다. 조건문을 꼼꼼히 설계해서 빨리 while 문을 탈출하는 등 필요하다

예제 1에서 

3명의 조카에게 같은 길이의 과자를 나눠 주려면 

8,9,10 길이의 과자를 8,8,8로 3명 나눠주면 된다

 

예제 2에서 

4명의 조카에게 같은 길이의 과자를 나눠 주려면 

10, 10, 15를 7로 나누서 7,7,7,7로 나눠주면 된다

 


정답

import sys

def Count(length):
    cnt=0
    for x in snacks:
        if x>=length:               # 이부분을 생각못함 ㅠ이부분 추가 중요! 
            cnt+=(x//length)
    return cnt

if __name__=="__main__":
    M,N=map(int, input().split())               # 조카수:M, 과자의 수:N 
    snacks=list(map(int, input().split()))

    start=0
    end=sys.maxsize

    res=0
    while start<=end:
        mid=(start+end)//2
        if mid==0:       # 모든 조카에게 같은 길이의 막대과자를 나눠줄 수 없을 때
            break        # 이부분을 생각못함 ㅠ
        if Count(mid)>=M:
            res=mid
            start=mid+1
        else:
            end=mid-1

    print(res)

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.