※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 19939번 문제인 박 터뜨리기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/19939
19939번: 박 터뜨리기
$N$개의 공을 $K$개의 바구니에 문제의 규칙을 만족하면서 나눠 담을 수 있다면, 가장 많이 담긴 바구니와 가장 적게 담긴 바구니의 공의 개수 차이를 출력한다. 나눠 담을 수 없는 경우에는 -1을
www.acmicpc.net
K개의 바구니에 빈 바구니 없이 담긴 공의 개수가 서로 다르게 공을 담는 방법은 각 바구니에 공을 1, 2, ..., K개씩 넣는 것이다. 이렇게 공을 넣는다면 공이 K*(K+1)/2개 필요하다. 따라서 공이 이보다 적다면 -1을 출력한다.
K*(K+1)/2개의 공을 남은 바구니에 어떻게 넣을 지 생각해보자. 만약 남은 공의 개수가 K의 배수라면, (남은 공 개수 / K)개씩의 공을 각 바구니에 골고루 나눠담는 것으로 문제의 답을 K-1로 할 수 있다는 것을 알 수 있다. 그러나 K의 배수가 아니라면 답이 K-1이 되게 할 수는 없지만 K가 되게끔 나눠담을 수 있다. K로 나눈 몫만큼씩 골고루 나눠담고, 남은 나머지개수 만큼의 공을을 공이 가장 많이 들어있는 바구니부터 하나씩 추가해주는 것으로 조건에 맞게 공을 분배할 수 있기 때문이다.
위의 내용을 간단히 구현하면 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, K; cin >> N >> K;
N -= K * (K + 1) / 2;
if (N < 0) cout << -1;
else {
N %= K;
if (N == 0) cout << K - 1;
else cout << K;
}
}
'BOJ' 카테고리의 다른 글
[BOJ 1648 // C++] 격자판 채우기 (0) | 2021.12.28 |
---|---|
[BOJ 19941 // C++] 햄버거 분배 (0) | 2021.12.27 |
[BOJ 2303 // C++] 숫자 게임 (0) | 2021.12.25 |
[BOJ 22021 // C++] 자동분무기 (0) | 2021.12.24 |
[BOJ 2514 // C++] 자동분무기 (0) | 2021.12.24 |