http://acmicpc.net/problem/19939
{코드}
def solution():
n, k = map(int, input().split())
sum_minimum = k*(k+1)//2
if sum_minimum > n:
return -1
if (n-sum_minimum) % k == 0:
return k-1
else:
return k
print(solution())
{설명}
K개의 바구니에 들어있는 공의 개수가 1개 이상이며 전부 달라야 하기 때문에 공의 최솟값은 k(k+1)/2이다.
그림처럼 각 바구니가 순서대로 공의 개수가 결정된다면 전의 바구니보다 1개 더 많을 때가 최소이기 때문이다.
그렇다면 최솟값보다 공의 개수가 적으면 -1을 반환하면 된다.
공의 개수가 더 많을 경우 1부터 n까지 세우고 남은 공의 개수를 생각해보자.
만약 공의 개수가 바구니의 수와 맞아 떨어진다면 각각 (남은 공의 개수)/(바구니 수)를 각 바구니에 더한 것과 같으므로 무시하면 된다.
그러면 가장 개수가 적은 바구니(1)과 가장 개수가 많은 바구니(k)의 차인 k-1을 반환한다.
바구니의 수와 맞아떨어지지 않으면 가장 개수가 많은 바구니부터 하나씩 더한다고 생각하면 되므로 가장 개수가 적은 바구니(1)와 가장 개수가 많은 바구니(k+1)의 차인 k를 반환한다.
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 10828번 - C++] 스택 (0) | 2021.03.20 |
---|---|
[백준 19940번-파이썬/Python] 피자 오븐 (0) | 2021.02.14 |
[백준 11653번-파이썬/Python] 소인수분해 (0) | 2021.01.07 |
[백준 10814번-파이썬/Python] 나이순 정렬 (0) | 2020.12.30 |
[백준 1181번-파이썬/Python] 단어 정렬 (0) | 2020.12.30 |