Post

permutation && combination

๐Ÿ™‹โ€โ™‚๏ธ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ์— ํ•™์Šตํ•  ๋‚ด์šฉ์€ ์ˆœ์—ด ๊ทธ๋ฆฌ๊ณ  ์กฐํ•ฉ์ด๋‹ค

์ˆœ์—ด์€ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์กฐํ•ฉ์€ ์ค‘๋ณต์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ˆœ์—ด ex) -> ์ž๋ฆฌ ๋ฐฐ์น˜
  • ์กฐํ•ฉ ex) -> ์š”๋ฆฌ์žฌ๋ฃŒ ์„ ํƒ

์ˆœ์—ด์˜ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ factorial์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค

โ–ฒpermutation

P = $\frac{n!}{(n-r)!}$

์นด๋“œ 5๊ฐœ ์ค‘ 2๊ฐœ ๊ณ ๋ฅด๊ธฐ

${5}P{2}$ -> 20






๐Ÿ•combination

์กฐํ•ฉ์ด๋‹ค

\[\binom{n}{k} = \frac{n!}{k!(n-k)!}\]

ํ”ผ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์žฌ๋ฃŒ a,b,c,d,e ์ค‘ 3๊ฐœ๋งŒ ๊ณ ๋ฅด๊ฒ ๋‹ค.

์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜ = (ํŠน์ • x๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜) + (ํŠน์ • x๋ฅผ ๋ฏธ์„ ํƒํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜)

์ด๊ฑธ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๊ฒ ๋‹ค

${5}C{3} = {4}C{2} + {4}C{3}$

๊ทธ๋Ÿฌ๋ฉด ์ „์ฒด ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ 10๊ฐ€์ง€๊ฐ€ ๋„์ถœ๋œ๋‹ค.

์ด๊ฑธ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๊ฒ ๋„ค

1
C[5][3] = C[4][2] + C[4][3]




์กฐํ•ฉ - ์ผ๋ฐ˜์ ํ™”์‹ ์ฝ”๋“œ

์ด๊ฑธ ์ผ๋ฐ˜ ์ ํ™”์‹ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๊ฒ ๋„ค

1
C[r][c] = C[r-1][c-1] + C[r-1][c-1]





โฑ๏ธ์‹œ๊ฐ„๋ณต์žก๋„

permutation

  • O(n!)

combination

  • ์กฐํ•ฉ ์ ํ™”์‹ DP -> O(nr)
  • DP ํŒŒ์Šค์นผ ๋ฐฉ์‹ -> O($N^2$)
  • ์žฌ๊ท€ ํŒฉํ† ๋ฆฌ์–ผ ๋ฐฉ์‹ O(N) ์ ˆ๋Œ€ ๊ธˆ์ง€!!! why?? -> overflow




์˜ˆ์ œ

boj_์ดํ•ญ๊ณ„์ˆ˜1_11050




2๊ฐ€์ง€ ํ’€์ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค




1๋ฒˆ ํ’€์ด (๊ฐ•๋ ฅ ๋น„์ถ” โŒ๏ธ)

O(N) ์ด์ง€๋งŒ ์ •๋ง ์ด๊ฑฐ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค

๋ฌธ์ œ ์กฐ๊ฑด์—์„œ N <= 10, K <= N ์ด์ง€๋งŒ, ๋งŒ์•ฝ N = 13 ์ด๋ฉด 13! ์œผ๋กœ int ์ดˆ๊ณผ, ๊ทธ๋ฆฌ๊ณ  19! ๋ผ๋ฉด long ๋ฒ”์œ„๋„ ์ดˆ๊ณผํ•ด์„œ ๊ฒฐ๊ตญ value overflow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ผ๋‹จ ํ•ด๋‹น ๋ฌธ์ œ๋Š” N <= 10, K <= N์ด์—ˆ๊ธฐ์— ์•„๋ž˜ ๊ณต์‹์„ ์ ์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค

$ \binom{N}{K} = \frac{N!}{K!(N-K)!} $

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] NK = br.readLine().split(" ");
		int N = Integer.parseInt(NK[0]);
		int K = Integer.parseInt(NK[1]);
		C(N, K);
	}
	
	
	
	static void C(int N, int K) {
		int denominator = 1;
		int numerator_1 = 1;
		int numerator_2 = 1;
		
		denominator = recursion(N);
		numerator_1 = recursion(K);
		numerator_2 = recursion(N-K);
		
		int res = denominator / (numerator_1 * numerator_2);
		System.out.println(res);
	}
	
	
	
	static int recursion(int x) {
		if (x <= 1) {
			return 1;
		}
		return x * recursion(x-1);
	}
	
	
	
	
}





2๋ฒˆ ํ’€์ด (๋ฌด์กฐ๊ฑด ์ด๊ฑฐ ์จ๋ผ โœ…๏ธ)

DP ํŒŒ์Šค์นผ ๋ฐฉ์‹์œผ๋กœ $O(N^2)$

N, K๊ฐ€ ์ปค์งˆ์ˆ˜๋ก, ๊ทธ๋ƒฅ ๋ฌป์ง€๋ง๊ณ 

์ด๊ฑฐ ๋‹ฅ์‚ฌ์šฉ์ด๋‹ค.
์™œ??? -> value overflow๊ฐ€ ์ž˜ ์•ˆ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

๐Ÿชœ๊ตฌ์ถ• ์ˆœ์„œ

  1. ๋ฐฐ์—ด ํฌ๊ธฐ ์„ ์–ธ
    • N=5์ผ๋•Œ -> DP[5+1][5+1]
  2. for๋ฌธ์œผ๋กœ ์ดˆ๊ธฐ ์„ธํŒ…
    • i๊ฐœ์ค‘ 1๊ฐœ ๋ฝ‘๊ธฐ -> i๊ฐœ
    • i๊ฐœ์ค‘ 0๊ฐœ ๋ฝ‘๊ธฐ -> 1๊ฐœ
    • i๊ฐœ์ค‘ i๊ฐœ ๋ฝ‘๊ธฐ -> 1๊ฐœ
  3. DP ํŒŒ์Šค์นผ ์ ํ™”์‹ ์ ์šฉ DP[r][c] = DP[r-1][c-1] + DP[r-1][c]



2๋ฒˆ๊ณผ์ •๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์œผ๋กœ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค

ย ย ย ย ย ย 
100000
110000
121000
13ย 100
14ย ย 10
15ย ย ย 1

์˜ค ์™ผ์ชฝ์œ„์—์„œ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๋Œ€๊ฐ์„ ์€ 1๋กœ ์ฑ„์›Œ์กŒ์œผ๋‹ˆ ์ €๊ฑธ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ 

์•ž์—๋งŒ ์ˆซ์ž ๊ฐฑ์‹ ํ•˜๋Š” ๋ฒ•์ด ์—†์„๊นŒ?

c๊ฐ€ r๋ณด๋‹จ ๋ฌด์กฐ๊ฑด ์ž‘์•„์•ผ๊ฒ ๋„ค

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋‚จ์€ ๊ณณ์„ DP ํŒŒ์Šค์นผ๋กœ ์ฑ„์›Œ๋ณด์ž

ย ย ย ย ย ย 
100000
110000
121000
133100
146410
15101051

์ผ๋‹จ ์™„์„ฑ์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค

์ด์ œ ๊ฒ€์ฆํ•ด๋ณด์ž

${0}C{0}$ ย  ${0}C{1}$ ย  ${0}C{2}$ ย  ${0}C{3}$ ย  ${0}C{4}$ ย  ${0}C{5}$

${1}C{0}$ ย  ${1}C{1}$ ย  ${1}C{2}$ ย  ${1}C{3}$ ย  ${1}C{4}$ ย  ${1}C{5}$

${2}C{0}$ ย  ${2}C{1}$ ย  ${2}C{2}$ ย  ${2}C{3}$ ย  ${2}C{4}$ ย  ${2}C{5}$

${3}C{0}$ ย  ${3}C{1}$ ย  ${3}C{2}$ ย  ${3}C{3}$ ย  ${3}C{4}$ ย  ${3}C{5}$

${4}C{0}$ ย  ${4}C{1}$ ย  ${4}C{2}$ ย  ${4}C{3}$ ย  ${4}C{4}$ ย  ${4}C{5}$

${5}C{0}$ ย  ${5}C{1}$ ย  ${5}C{2}$ ย  ${5}C{3}$ ย  ${5}C{4}$ ย  ${5}C{5}$

๋งŒ์•ฝ ์œ„์˜ ๋ฌธ์ž๊ฐ€ ๊นจ์ ธ๋ณด์ธ๋‹ค๋ฉด ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด๋‹ˆ ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด์ž

Desktop View



๋งž๋„ค


์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;


public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] NK = br.readLine().split(" ");
		int N = Integer.parseInt(NK[0]);
		int K = Integer.parseInt(NK[1]);
		lets_solve_this(N, K);
	}
	
	
	
	static void lets_solve_this(int N, int K) {
		// ๋ฐฐ์—ด ํฌ๊ธฐ ์„ ์–ธ
		int[][] DP = new int[N+1][N+1];
		
		// for๋ฌธ์œผ๋กœ ๋ฐฐ์—ด ๋งค ๋ฐ˜๋ณต๋งˆํƒ€ ์ž…๋ ฅ
		for (int i = 0; i < N+1; i++) {
			// i๊ฐœ์ค‘ 1๊ฐœ ๋ฝ‘๊ธฐ
			DP[i][1] = i;
			
			// i๊ฐœ์ค‘ 0๊ฐœ ๋ฝ‘๊ธฐ
			DP[i][0] = 1;
			
			//i๊ฐœ์ค‘ i๊ฐœ ๋ฝ‘๊ธฐ
			DP[i][i] = 1;
		}
		
		
		// ๋‚จ์€ ์นธ ์ฑ„์šฐ๊ธฐ
		// c๋Š” r์„ ์ ˆ๋Œ€ ๋„˜์œผ๋ฉด ์•ˆ๋ผ~
		for (int r = 3; r < N+1; r++) {
			for (int c = 2; c < r; c++) {
				DP[r][c] = DP[r-1][c-1] + DP[r-1][c];
			}
		}
		
		
		// result
		System.out.println(DP[N][K]);
	}
	
	
	
	
}
This post is licensed under CC BY 4.0 by the author.
3D GIF

Trending Tags

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด
๋‚˜๋ฅผ ๋ˆŒ๋Ÿฌ ๊ตฌ๋ฆฌ๐Ÿป
์ฑ—๋ด‡
๋„ˆ๊ตด
bot
์–ด์„œ์™€ ๊ตฌ๋ฆฌ ส• ยทแดฅยทส”
๋ฌด์—‡์ด ํ•„์š”ํ•˜์…” ๊ตฌ๋ฆฌ?

Trending Tags

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด
๋‚˜๋ฅผ ๋ˆŒ๋Ÿฌ ๊ตฌ๋ฆฌ๐Ÿป
์ฑ—๋ด‡
๋„ˆ๊ตด
bot
์–ด์„œ์™€ ๊ตฌ๋ฆฌ ส• ยทแดฅยทส”
๋ฌด์—‡์ด ํ•„์š”ํ•˜์…” ๊ตฌ๋ฆฌ?