1. 입력 및 출력
- 입력: 첫째 줄에 과일의 종류 수 N(1 ≤ N ≤ 10)이 주어진다.
둘째 줄에 훔치려 하는 과일의 개수 M(N ≤ M ≤ 30)이 주어진다. - 출력: 첫째 줄에 훔칠 수 있는 경우의 수를 출력한다.
2. 풀이
민건이는 N 종류의 과일을 재배 중이라고 하고있다.
이때, 지환이가 과일을 훔치게 되는데, 민건이가 가지고 있는 모든 과일을 하나씩 훔치면서, 훔칠 수 있는 경우의 수를 찾는 것이다.
입력 예시를 보자.
과일의 종류의 수가 3개이고, 훔치려는 과일의 개수가 10개이다.
모든 종류의 과일을 적어도 1개씩을 훔쳐야 하므로, 뽑은 과일의 종류를 또 훔치는 것이 허용된다.
이렇게 하여 총 10개를 뽑는 것이다.
결론지으면 3가지 종류 중 중복을 허락하여 10개를 뽑으라는 의미이다. 이것은 중복조합으로 해결할 수 있다.
3. 코드
<code />
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.util.*
val bw = BufferedWriter(OutputStreamWriter(System.out))
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val m = readLine().toInt()
val answer: Long = factorial(m-n+1, m-1) / factorial(1, n-1)
bw.write("$answer")
bw.flush()
bw.close()
close()
}
fun factorial(a: Int, b: Int): Long {
var res = 1L
for(i in a..b) {
res *= i
}
return res
}
중복조합의 공식은 다음과 같고 조합 공식으로 치환이 가능하다.
$$ {}_n \mathrm{ H }_k = {}_n{}_+{}_k{}_-{}_1 \mathrm{ C }_n{}_-{}_1 $$
조합은 다음 팩토리얼을 사용한 다음 공식으로 치환할 수 있다.
$$ {}_n \mathrm{ C }_k = \frac{n!}{k!(n-k)!} $$
이 공식을 적용해서 factorial 함수를 만들어 중복조합을 계산한다.
여기서 n의 범위가 0부터 10이고, k의 범위가 n부터 30이라는 점을 감안하여 factorial 함수의 return type은 Long 타입으로 선언해준다.
4. 결과
괜찮은 결과를 얻을 수 있었다.
'PS > BOJ' 카테고리의 다른 글
[BOJ - 5430] [백준 - 1269] 대칭차집합[Silver - 4] [Solved by Kotlin] (0) | 2023.12.13 |
---|---|
[BOJ - 5430] [백준 - 28278] 스택2 [Silver - 4] [Solved by Kotlin] (0) | 2023.12.07 |
[BOJ - 5430] [백준 - 5430] AC [Gold - 5] [Solved by Kotlin] (0) | 2023.08.11 |
[BOJ-11404][백준 11404] 플로이드[GOLD-4][Solved by Kotlin] (0) | 2023.04.22 |
[BOJ-2941][백준 2941] 크로아티아 알파벳[SILVER-5] [Solved by Kotlin] (0) | 2023.04.20 |