๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/120840
ํ์ด
class Solution {
public int solution(int balls, int share) {
long result = 1;
for (int i = 1; i <= share; i++) {
result = result * (balls - i + 1) / i;
}
return (int) result;
}
}
๐ก ์กฐํฉ ๊ณ์ฐ ์์ ์ ๋ณต — ํฉํ ๋ฆฌ์ผ ์์ด ์์ ํ๊ฒ ๊ตฌํ๊ธฐ
์ฝ๋ฉํ ์คํธ์์ ์ ๋ง ์์ฃผ ๋์ค๋ ๋ํ์ ์ธ ์ํ ๊ฐ๋ ์ค ํ๋๊ฐ ์กฐํฉ(Combination)
- ์: “๊ตฌ์ฌ N๊ฐ ์ค R๊ฐ๋ฅผ ๊ณ ๋ฅผ ์ ์๋ ๊ฒฝ์ฐ์ ์”๋ฅผ ๊ตฌํ๋ผ๋ ๋ฌธ์
์ฒ์์ ๊ณต์๋ง ์ธ์์ ๊ตฌํํ๋ ค๋ค ํฉํ ๋ฆฌ์ผ๋ก ์ธํ ์ค๋ฒํ๋ก์ฐ๋ ๊ณต์์ด ์ ๊ทธ๋ ๊ฒ ๋๋์ง ์ดํด ์ ๋๋ ์ํฉ์ด ์์ฃผ ๋ฐ์ํจ
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋
- โ ์กฐํฉ์ด ๋ญ์ง
- โ ๊ณต์์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง
- โ ํฉํ ๋ฆฌ์ผ ๋์ ๋จ๊ณ๋ณ๋ก ๊ณ์ฐํ๋ ์ด์
- โ
long ํ์
์ ์ฐ๋ ์ด์
๊น์ง ์ ๋ถ ์ ๋ฆฌ
๐ช 1. ์กฐํฉ์ด๋?
์กฐํฉ(Combination)์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ n๊ฐ ์ค r๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋งํจ
์: ๊ตฌ์ฌ 3๊ฐ ์ค 2๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค๊ณ ๊ฐ์
{A, B}, {A, C}, {B, C}
๐ ์ด 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํจ
์ํ์ ํํ:
- ( n ): ์ ์ฒด ๊ฐ์
- ( r ): ๊ณ ๋ฅด๋ ๊ฐ์
๐งฎ 2. ์กฐํฉ์ ๊ธฐ๋ณธ ๊ณต์
์กฐํฉ์ ๊ธฐ๋ณธ ๊ณต์์ ์๋์ ๊ฐ์
์: 5๊ฐ ์ค 3๊ฐ ๊ณ ๋ฅด๊ธฐ → ( 5C3 )
์ฆ, 10๊ฐ์ง ์กฐํฉ์ด ์๊น
๐ง 3. ๊ณต์์ด ๊ทธ๋ ๊ฒ ๋์ค๋ ์ด์
์ฒ์์ 5๊ฐ ์ค 3๊ฐ๋ฅผ ์์๋ฅผ ๊ณ ๋ คํด์ ๋ฝ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด๋ฉด:
- 1๋ฒ์งธ: 5๊ฐ ์ค ์ ํ
- 2๋ฒ์งธ: 4๊ฐ ์ค ์ ํ
- 3๋ฒ์งธ: 3๊ฐ ์ค ์ ํ
๐ ( 5 × 4 × 3 = 60 )๊ฐ์ง ๊ฒฝ์ฐ
ํ์ง๋ง ์กฐํฉ์์๋ ์์๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์
์: A-B-C, B-A-C, C-B-A … ๋ชจ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ก ์ทจ๊ธ๋จ
3๊ฐ๋ฅผ ๋ฝ์ ๋ ์์๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ์ ์๋ ( 3! = 6 )๊ฐ์ง
๊ทธ๋์
์ด ๋๋ ๊ฑฐ๊ณ , ๊ณต์๋
์ ํํ๋ก ๋จ์ํ๋จ
๐ (n - r)! ๋ถ๋ถ์ด ์ฝ๋ถ๋ผ์ ์ฌ๋ผ์ง๋ ๊ฒ
๐ซ 4. ํฉํ ๋ฆฌ์ผ์ ์ง์ ์ฐ๋ฉด ์ ๋๋ ์ด์
์ฒ์์๋ ๋ง์ด๋ค ์ด๋ ๊ฒ ๊ตฌํํจ:
return factorial(n) / (factorial(n - r) * factorial(r));
ํ์ง๋ง ์ด ๋ฐฉ์์๋ ๋ฌธ์ ๊ฐ ์์
- ํฉํ ๋ฆฌ์ผ ๊ฐ์ด ๋๋ฌด ๋นจ๋ฆฌ ์ปค์ง
- 20!๋ง ํด๋ 2,432,902,008,176,640,000
- int๋ long์ผ๋ก๋ ๊ฐ๋น ์ ๋๋ ๊ฐ์ด ๊ธ๋ฐฉ ๋์ด
- ๋ถํ์ํ ์ฐ์ฐ์ด ๋ง์ (๊ณ์ฐํ๋ค๊ฐ ๋ค์ ๋๋)
- ์ฑ๋ฅ ์ ํ + ์ค๋ฒํ๋ก์ฐ ์ํ
๊ทธ๋์ ํฉํ ๋ฆฌ์ผ ์์ฒด๋ฅผ ๊ณ์ฐํ์ง ์๊ณ , ๊ณต์์ ๋จ๊ณ๋ณ ๊ณฑ์ ·๋๋์ ์ผ๋ก ๋ฐ๊ฟ์ ๊ณ์ฐํจ
๐ช 5. ํฉํ ๋ฆฌ์ผ์ ์ฐ์ง ์๊ณ ๋จ๊ณ๋ณ๋ก ๊ณ์ฐํ๊ธฐ
class Solution {
public int solution(int balls, int share) {
long result = 1;
for (int i = 1; i <= share; i++) {
result = result * (balls - i + 1) / i;
}
return (int) result;
}
}
๐งญ 6. ์ฝ๋ ์ค๋ช
๋ณ์ | ์๋ฏธ | ์ํ ๊ธฐํธ |
balls | ์ ์ฒด ๊ตฌ์ฌ ๊ฐ์ | n |
share | ๋ฝ๋ ๊ตฌ์ฌ ๊ฐ์ | r |
i | ํ์ฌ ๋ช ๋ฒ์งธ ๋ฝ๋ ์ค์ธ์ง (1๋ถํฐ r๊น์ง) | - |
result | ๋์ ๊ณ์ฐ ๊ฐ | nCr |
(balls - i + 1)์ ๋ถ์์์ ์ ์ ์ค์ด๋๋ ์ ํ์ง๋ฅผ ์๋ฏธ
/ i๋ ๋ถ๋ชจ์์ ์ค๋ณต๋๋ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ถ๋ถ
์: balls=5, share=3์ผ ๋
i | ๋ถ์ (balls - i + 1) | ๋ถ๋ชจ (i) | result ๊ณ์ฐ |
1 | 5 | 1 | 1 × 5 ÷ 1 = 5 |
2 | 4 | 2 | 5 × 4 ÷ 2 = 10 |
3 | 3 | 3 | 10 × 3 ÷ 3 = 10 |
๐ ์ต์ข ๊ฒฐ๊ณผ = 10 โ
๐งฑ 7. long ํ์ ์ ์ฌ์ฉํ๋ ์ด์
- int๋ ์ฝ 21์ต๊น์ง๋ง ์ ์ฅ ๊ฐ๋ฅ (2,147,483,647)
- ํ์ง๋ง ํฉํ ๋ฆฌ์ผ์ด๋ ์กฐํฉ ์ค๊ฐ ๊ณ์ฐ๊ฐ์ ํจ์ฌ ์ปค์ง ์ ์์
- balls์ ์ต๋๊ฐ์ด 30์ด๋ผ๋ ์ค๊ฐ ๊ณ์ฐ๊ฐ์ด int ๋ฒ์๋ฅผ ๋์ ์ ์์
๋ฐ๋ผ์ ์ค๊ฐ ๊ณ์ฐ์ long์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ง์ง๋ง์ int๋ก ๋ณํํด๋ ์์ ํจ
๐ ์ ๋ฆฌ ์์ฝ
ํญ๋ชฉ | ์๋ชป๋ ๋ฐฉ์ โ | ์ฌ๋ฐ๋ฅธ ๋ฐฉ์ โ |
๊ตฌํ ๋ฐฉ๋ฒ | ํฉํ ๋ฆฌ์ผ๋ก ์ง์ ๊ณ์ฐ | ๋จ๊ณ๋ณ ๊ณฑ์ /๋๋์ |
์ค๋ฒํ๋ก์ฐ ์ํ | ๋์ | ๋ฎ์ |
์ฑ๋ฅ | ๋ถํ์ํ ๊ณ์ฐ ๋ง์ | ๊ณ์ฐ ๊ฐ๊ฒฐ |
์๋ฃํ | int | long ์ฌ์ฉ ํ int ๋ณํ |
๊ณต์์ ๊ทธ๋๋ก ๋จ๊ณ๋ณ๋ก ํ์ด ์ฐ๋ฉด ํฉํ ๋ฆฌ์ผ ์์ด๋ ์กฐํฉ์ ์ ํํ๊ฒ ๊ตฌํ ์ ์์
๐ ๋ง๋ฌด๋ฆฌ
- ์กฐํฉ ๊ณต์์ <์์๋ฅผ ์ ๊ฑฐํ ๊ฒฝ์ฐ์ ์>๋ผ๋ ๊ฐ๋ ์์ ์ถ๋ฐํจ
- ํฉํ ๋ฆฌ์ผ์ ์ง์ ์ฐ๋ฉด ์ค๊ฐ ๊ฐ์ด ๋๋ฌด ์ปค์ง๋ฏ๋ก ํผํ๋ ๊ฒ์ด ์ข์
- ๊ณฑ์ ๊ณผ ๋๋์ ์ ๋ฃจํ๋ก ๋๋์ด ์ฒ๋ฆฌํ๋ฉด ์์ ํ๊ณ ๊น๋ํ๊ฒ ๊ณ์ฐ ๊ฐ๋ฅ
- ์๋ฃํ์ ๋ฐ๋์ long์ ์ฌ์ฉํ๊ธฐ
'Algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv.0 | ๊ฐ์ ๋ฐ์ ๋ณด | Java (0) | 2025.10.21 |
---|---|
[Programmers] Lv.0 | ์ ์ ์์น ๊ตฌํ๊ธฐ | Java (0) | 2025.10.19 |
[Programmers] Lv.0 | 2์ฐจ์์ผ๋ก ๋ง๋ค๊ธฐ | Java (0) | 2025.10.18 |
[Programmers] Lv.0 | ๊ณต ๋์ง๊ธฐ | Java (0) | 2025.10.17 |
[Programmers] Lv.0 | ๋ฐฐ์ด ํ์ ์ํค๊ธฐ | Java (0) | 2025.10.16 |
๋๊ธ