경우 의 수 알고리즘 | 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리) 120 개의 베스트 답변

당신은 주제를 찾고 있습니까 “경우 의 수 알고리즘 – 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리)“? 다음 카테고리의 웹사이트 https://ppa.khunganhtreotuong.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.khunganhtreotuong.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 classlive 이(가) 작성한 기사에는 조회수 315,955회 및 좋아요 7,670개 개의 좋아요가 있습니다.

Table of Contents

경우 의 수 알고리즘 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리) – 경우 의 수 알고리즘 주제에 대한 세부정보를 참조하세요

경우의 수 공식들을 한번에 모두 설명했습니다.
경우의 수 공식들 한번에 모아 둔 블로그 포스팅입니다.
http://algosn.blog.me/221413837039
수업 후에 영상을 찍어서 목소리가 안좋았는데요. 양해 부탁드릴게요.
시험 전 총정리에 도움 되셨으면 좋겠습니다.

00:16 곱의 법칙 / 합의 법칙
02:49 팩토리얼
04:32 순열 / 조합
09:01 같은 것이 있는 순열
10:26 원순열
13:03 최단거리 길찾기
15:48 중복순열
18:50 중복조합
22:13 분할(집합의 분할)
25:36 분할(자연수의 분할)
27:51 이항정리

수학 누구나 잘 할 수 있습니다. 힘내세요!
-알고리즘 진카 (010-3103-2722)

알고리즘성남학원 블로그
https://blog.naver.com/algosn
홈페이지
http://algorithm.or.kr/

경우 의 수 알고리즘 주제에 대한 자세한 내용은 여기를 참조하세요.

경우의 수를 찾는 방법 – 순열, 조합 그리고 재귀함수 – velog

완전탐색의 경우의 수를 푸는 알고리즘에는 순열, 조합, 중복순열이 있다. 순열. 서로 다른 n개의 원소 중에서 r을 중복 없이 골라 순서에 상관 있게 …

+ 여기를 클릭

Source: velog.io

Date Published: 3/30/2021

View: 9460

[Algorithm] 경우의 수(순열과 조합) – 통 속의 뇌

1. 경우의 수 경우의 수 어떤 사건 혹은 일이 일어날 수 있는 경우의 가짓수를 수로 표현 완전 탐색으로 경우의 수를 푸는 알고리즘 순열(nPr) …

+ 여기를 클릭

Source: kindle14.tistory.com

Date Published: 1/20/2021

View: 7538

[Algorithm] 경우의 수(순열)

완전탐색으로 경우의 수를 푸는 알고리즘 중 순열에 대해 공부해보자. 개요 🛫. 순열(Permutation)은 보통 모든 경우의 수를 탐색해서 해를 찾을때 사용된다.

+ 여기에 더 보기

Source: intrepidgeeks.com

Date Published: 10/8/2022

View: 2047

[알고리즘] 조합, 순열, 중복순열 – 경우의 수 찾기 by javascript (ft …

[알고리즘] 조합, 순열, 중복순열 – 경우의 수 찾기 by javascript (ft. 모든 경우의 수) · 1. 선택하려는 개수를 확인한다. (ex 배열에서 2개의 값으로 …

+ 여기에 표시

Source: mine-it-record.tistory.com

Date Published: 6/16/2021

View: 5322

경우의 수, 합의 법칙, 곱의 법칙 – 수학방

경우의 수, 합의 법칙, 곱의 법칙. 방학이 다 끝나고, 2학기가 시작되었어요. 2학기에는 확률과 도형에 대해서 공부해요. 1학기 때 배웠던 연립방정식이나 함수와 다른 …

+ 여기에 보기

Source: mathbang.net

Date Published: 7/11/2022

View: 3697

[알고리즘] 경우의 수를 푸는 순열, 조합 그리고 파스칼의 삼각형

경우의 수를 구하는 방법 중 기초가 되는 순열, 조합, 그리고 파스칼의 삼각형에 대해 알아보도록 하겠습니다. 먼저 순열, permutation이란 순서가 …

+ 여기에 보기

Source: blog.naver.com

Date Published: 10/1/2022

View: 6336

[Algorithm] 순열(Permutation) 경우의 수 구하는 알고리즘 문제 …

[Algorithm] 순열(Permutation) 경우의 수 구하는 알고리즘 문제(feat. 재귀(Recursion) 함수 사용). about-tech 2022. 5. 20. 23:26 …

+ 더 읽기

Source: about-tech.tistory.com

Date Published: 7/11/2022

View: 8709

[경우의 수] 순열, 조합, 중복 순열 – dino!!!

여러분이 많이 알고 있는 경우의 수구하는 알고리즘인데, 이를 넘어서 해당 성분들까지 구해보는 경우를 구해봅시다!! 순열(Permutation). 먼저 순열이 …

+ 여기에 더 보기

Source: dinohee.tistory.com

Date Published: 4/2/2021

View: 9876

주제와 관련된 이미지 경우 의 수 알고리즘

주제와 관련된 더 많은 사진을 참조하십시오 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열,  중복순열, 중복조합, 분할, 이항정리)
경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리)

주제에 대한 기사 평가 경우 의 수 알고리즘

  • Author: classlive
  • Views: 조회수 315,955회
  • Likes: 좋아요 7,670개
  • Date Published: 2019. 4. 25.
  • Video Url link: https://www.youtube.com/watch?v=_Tkq_XC3slw

경우의 수를 찾는 방법 – 순열, 조합 그리고 재귀함수

완전탐색의 경우의 수를 푸는 알고리즘에는 순열, 조합, 중복순열이 있다.

순열

서로 다른 n개의 원소 중에서 r을 중복 없이 골라 순서에 상관 있게 나열하는 경우의 수를 구하는 경우. 예를 들어 3개의 알파벳 A B C의 순열은 ABC / ACB / BAC / BCA / CAB / CBA 로 총 6가지이다.

기본적으로 for문을 사용하여 순열을 찾을 수 있다.

for문으로 경우의 수를 도출

let input = [ ‘a’ , ‘b’ , ‘c’ ] ; let count = 0 ; function permutation ( arr ) { for ( let i = 0 ; i < arr . length ; i ++ ) { for ( let j = 0 ; j < arr . length ; j ++ ) { if ( i == j ) continue ; for ( let k = 0 ; k < arr . length ; k ++ ) { if ( i == k ) continue ; if ( j == k ) continue ; console . log ( arr [ i ] , arr [ j ] , arr [ k ] ) ; count ++ ; } } } } permutation ( input ) ; console . log ( count ) ; arr[i], arr[j], arr[k]를 찍어보면 abc acb bac bca cab cba가 나오고 count는 6이 출력된다. 요소가 너무 많아지면 for문으로는 대처하는데에 한계가 있다. 그럴때 재귀함수 를 주로 사용한다. 재귀함수는 자기 스스로를 호출하는 함수 이다. 재귀함수로 경우의 수를 도출 재귀함수의 도출할때는 함수 속에서 자기 자신의 함수를 다시 호출하면서 로직이 반복되는데 주의할 점은 재귀함수를 멈춰야할 조건을 설정해 주어야 한다는 것이다. 아래의 예제는 재귀함수를 사용해 매개변수만 수정하면서 스스로를 다시 호출, 로직을 돌며 배열 아이템의 순서가 동일할 경우는 위치를 그대로 두고, 다를 경우에는 앞뒤의 위치를 바꿔주는 방식으로 경우의 수를 도출한 방법이다. 매개변수에는 (입력값이 담긴 배열, start위치(입력값중 첫번째), 출력할 요소 개수) 을 준다. let input = [ 'a' , 'b' , 'c' ] ; let _count = 0 ; function _permutation ( arr , s , r ) { if ( s == r ) { _count ++ ; console . log ( arr . join ( " " ) ) ; return ; } for ( let i = s ; i < arr . length ; i ++ ) { [ arr [ s ] , arr [ i ] ] = [ arr [ i ] , arr [ s ] ] ; _permutation ( arr , s + 1 , r ) ; [ arr [ s ] , arr [ i ] ] = [ arr [ i ] , arr [ s ] ] ; } } _permutation ( input , 0 , 3 ) ; console . log ( _count ) ; 위의 예제의 for문을 보면 i의 자리에 s를 대입하고( 재귀함수를 처음 호출했을 때, i의 값이 s의 값과 같게 시작하는 이유이다. ) i는 배열 아이템의 길이까지 반복된다. 재귀함수가 호출될때 s + 1을 하면서 실행이 되고, s==r 이라면 그 전까지의 배열이 즉시 출력되고 return되어 그 전의 함수(재귀함수를 호출했던 함수)로 돌아가서 아래의 남아있던 코드가 실행된다. 과정 [_permutation] s=0,i=0 -> [0,0]=[0,0] > [a,a]=[a,a] -> s+1하며 재귀함수 호출 [_permutation-1] s=1,i=1 (s의 값을 i에 대입해서 i값이 1에서 부터 시작) -> [1,1]=[1,1] > [b,b]=[b,b] -> s+1하며 재귀함수 호출 [_permutation-2] s=2,i=2 -> 재귀함수 멈추는 조건 true -> count++하고 그전까지의 arr을 출력([a,b,c] : swap없었음) return ( ‘_permutation-1’으로 돌아감 ) [_permutation-1] – 재귀함수 호출코드 아래 코드부터 실행 s=1,i=1 -> [1,1]=[1,1] > [b,b]=[b,b] -> swap하지않음 -> 그대로[a,b,c] i++ s=1,i=2 -> [1,2]=[2,1] > [b,c]=[c,b] -> swap -> [a,c,b] -> s+1하며 재귀함수 호출 [_permutation-3] s=2,i=2 -> 재귀함수 멈추는 조건 true -> [a,c,b]출력 return (‘_permutation-1’로 돌아감) [_permutation-1] s=1,i=2 -> [1,2]=[2,1] > [c,b]=[b,c] -> swap -> [a,b,c] i=2로 반복문 종료 (*코드가 끝나지 않은’_permutation’이 실행*) [_permutation] – 재귀함수 호출코드 아래 코드부터 실행 s=0,i=0 -> [0,0]=[0,0] > [a,a]=[a,a] -> [a,b,c] i++ s=0,i=1 -> [0,1]=[1,0] > [a,b]=[b,a] -> [b,a,c] . . . s=0,i=2 [0,2]=[2,0] > [a,c]=[c,a] -> [c,a,b]

조합

서로 다른 n개의 원소 중에서 r을 중복 없이 골라 순서에 상관 없이 나열하는 경우의 수를 구하는 경우. 예를 들어 1,2,3,4 4개의 숫자 카드에서 2개를 뽑는 조합은 1 2 (2 1과 같다) / 1 3 / 1 4 / 2 3 / 2 4 / 3 4로 총 6개이다.

4C2(4combination2) = nCr

nCr = n! / (n-r)! r! = 4321 / 2*2 = 6

for문으로 경우의 수를 도출

let input2 = [ 1 , 2 , 3 , 4 ] ; let count2 = 0 ; function combination ( arr ) { for ( let i = 0 ; i < arr . length ; i ++ ) { for ( let j = i + 1 ; j < arr . length ; j ++ ) { count2 ++ ; console . log ( arr [ i ] , arr [ j ] ) ; } } } combination ( input2 ) ; console . log ( count2 ) ; 재귀함수로 경우의 수를 도출 매개변수로 아웃풋이 저장될 data와 현재위치 정보를 주는 idx가 추가되었다. let input2 = [ 1 , 2 , 3 , 4 ] ; let count2 = 0 ; let output = [ ] ; function _combination ( arr , data , s , idx , r ) { if ( s == r ) { count3 ++ ; console . log ( data ) ; return ; } for ( let i = idx ; arr . length - i >= r – s ; i ++ ) { data [ s ] = arr [ i ] ; _combination ( arr , data , s + 1 , i + 1 , r ) ; } } _combination ( input2 , output , 0 , 0 , 2 ) ; console . log ( count3 ) ;

[Algorithm] 경우의 수(순열과 조합)

1. 경우의 수

경우의 수

어떤 사건 혹은 일이 일어날 수 있는 경우의 가짓수를 수로 표현

완전 탐색으로 경우의 수를 푸는 알고리즘 순열(nPr) 조합(nCr) 중복(nH): 서로 다른 n개의 원소 중 r을 중복으로 골라 순서에 상관 있게 나열하는 수

1) 순열

: 서로 다른 n개의 원소 중 r을 중복 없이 골라 순서에 상관 있게 나열하는 수

✔ for문

증가 할수록 대처 하는데 한계가 있음

let input = [“a”, “b”, “c”]; let count = 0; function permutation(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length; j++) { if (i == j) continue; // 중복되면 skip처리 for (let k = 0; k < arr.length; k++) { if (i == k) continue; if (j == k) continue; console.log(arr[i], arr[j], arr[k]); count++; } } } } permutation(input); console.log(count); ✔ 재귀함수 🤯 let input = ["a", "b", "c"]; let count = 0; function permutation(arr, s, r) { // 1. 재귀를 멈출 조건 if (s == r) { count++; console.log(arr.join(" ")); return; } // 재귀 돎녀 변경되어야 할 부분 for (let i = s; i < arr.length; i++) { // 스왑, 앞자리를 계속 변경해줌 [arr[s], arr[i]] = [arr[i], arr[[s]]; permutation(arr, s + 1, r); [arr[s], arr[i]] = [arr[i], arr[s]]; } } permutation(input, 0, 2); console.log(count); 2) 조합 : 서로 다른 n개의 원소 중 r을 중복 없이 골라 순서에 상관 없이 나열하는 수 ✔ for문 let input = [1, 2, 3, 4]; let count = 0; function combination(arr) { for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { count++; console.log(arr[i], arr[j]); } } } combination(input); console.log(count); ✔ 재귀함수 🤯 let input = [1, 2, 3, 4]; let output = []; let count = 0; function combination(arr, data, s, idx, r) { if (s == r) { count++; console.log(data); return; } for (let i = idx; arr.length - 1 >= r – s; i++) { combination(arr, data, s + 1, i + 1, r); } } combination(input, output, 0, 0, 2); console.log(count);

[Algorithm] 경우의 수(순열)

💡 완전탐색으로 경우의 수를 푸는 알고리즘 중 순열에 대해 공부해보자.

개요 🛫

순열(Permutation)은 보통 모든 경우의 수를 탐색해서 해를 찾을때 사용된다. (완전탐색)

아주 아주 기본적인 이론이므로 머릿속에 넣어두자 👍🏽

학습 내용 📖 순열(Permutation) 정의

서로 다른 n개의 원소 중에서 r개를 중복없이 순서에 상관있게 선택 혹은 나열하는 것 nPr

서로 다른 n개 중복을 허락하지 않고 나열하는 수

이미지 : 순열 공식

예시

(1, 2, 3) 의 집합에서 3(모든)개의 순열을 구하는 경우 3P3

아래의 그림처럼 요소를 선택하고 선택한 요소들을 제외한 나머지 요소가 선택될 수 있는 경우의 수들을 분개하여 나열한다.

프로그래밍 관점에서 순열은 선택할 인덱스와 교환될 인덱스를 SWAP 하는 과정을 반복하여 순열을 만들 수 있다.

이게 무슨 얘기냐면..

최초 (1, 2, 3) 의 집합에서

1 선택 (1, )

1 선택된 상태에서 2 선택 (1, 2, 3)

1 선택된 상태에서 2와 3 스왑 (1, 3, 2)

1과 2 스왑으로 2 선택 (2, ).. 아래 예제 코드로 이해해보자..

예제 코드 1 (For Loop)

let input = [ “a” , “b” , “c” ] ; let count = 0 ; function permutation ( arr ) { for ( let i = 0 ; i < arr . length ; i ++ ) { for ( let j = 0 ; j < arr . length ; j ++ ) { if ( i === j ) continue ; for ( let k = 0 ; k < arr . length ; k ++ ) { if ( i === k ) continue ; if ( j === k ) continue ; console . log ( arr [ i ] , arr [ j ] , arr [ k ] ) ; count ++ ; } } } } permutation ( input ) ; console . log ( count ) ; 이런 방식의 중첩 for문으로 코드를 짜면 input 요소의 개수가 커질 수록 for 문의 depth가 .. 어마어마해질 것이다. 그래서 순열이나 조합을 구하는 알고리즘에서는 재귀 함수(Recursion) 를 자주 이용한다. 예제 코드 2 (Recursion) 👍🏽 let input = [ "a" , "b" , "c" ] ; let count = 0 ; function permutation ( arr , s , r ) { if ( s === r ) { count ++ ; console . log ( arr . join ( " " ) ) ; return ; } for ( let i = s ; i < arr . length ; i ++ ) { [ arr [ s ] , arr [ i ] ] = [ arr [ i ] , arr [ s ] ] permutation ( arr , s + 1 , r ) ; [ arr [ s ] , arr [ i ] ] = [ arr [ i ] , arr [ s ] ] } } permutation ( input , 0 , 2 ) ; console . log ( count ) ; 위 예제를 보면 요소의 개수가 길어져도 for문을 추가해주지 않아도 된다. 예제 코드2의 스왑 부분을 분석해보자. 1) s = 0, r = 2 (i = 0, s = 0) 이기때문에 SWAP을 해도 "A"를 선택 : ["a", ] 2) 재귀로 들어가면서 s + 1 3) s = 1, r = 2 (i = 1, s = 1) 이기때문에 SWAP을 해도 "B"를 선택 : ["a", "b", ] 4) 재귀로 들어가면서 s + 1 5) s = 2, r = 2 (i = 2, s = 2) 이기때문에 남은 "C"를 선택 : ["a", "b", "c"] ... 1) s = 1, r = 2 (i = 2, s = 1) 이기때문에 SWAP을 해서 "C"를 선택 : ["a", "c", ] 2) s = 2, r = 2 (i = 2, s = 2) 이기때문에 남은 "B"를 선택 : ["a", "c", "b"] return 으로 재귀 함수 탈출 재귀 밖 for문의 i++ 1) s = 0, r = 2, i = 1 이기때문에 SWAP을 해서 "B"를 선택 : ["b", ] ... return 으로 재귀 함수 탈출 재귀 밖 for문의 i++ 1) s = 0, r = 2, i = 2 이기때문에 SWAP을 해서 "C"를 선택 : ["c", ] ... return 으로 재귀 함수 탈출 console.log 찍고 종료 위와 같이 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법을 백트래킹 이라고한다. 재귀 함수는 빈번히 활용되므로 내부 로직의 이해를 잘 해야한다 💡

[알고리즘] 조합, 순열, 중복순열 – 경우의 수 찾기 by javascript (ft. 모든 경우의 수)

반응형

(이 글로 이해가 안된다면 정말 자세한 내용과 설명은 본문 하단에 링크를 달아뒀으니 해당 블로그 가서 보면 된다. 정말 정리를 잘해놨다.)

완전 탐색 알고리즘의 방식인 조합, 순열, 중복순열 알고리즘 에 대해 알아보자.

왜 이 3가지 알고리즘을 동시에 다루냐면 알고리즘 구조가 비슷하기 때문이다.

전체적으로 아래와 같은 형식을 지닌다.

1. 선택하려는 개수를 확인한다. (ex 배열에서 2개의 값으로 이루어진 조합 혹은 순열)

2. 배열의 길이만큼 반복한다.

3. 배열에서 하나의 수를 선택한다. (기준 값)

4. 기준 값을 제외한 나머지 배열을 가지고 다시 1번부터 시작한다. (재귀)

위 방식을 통해 계속해서 재귀를 통해 반복하다보면 순열, 중복순열, 조합을 구할 수 있다.

각 조합, 순열, 중복순열 별 달라지는 부분은 4번부분이다.(나머지 배열의 기준이 달라진다.)

대략 어떤느낌인지 알았다면 아래 코드를 통해 다시한번 접해보고 다시와서 읽어보도록 하자.

1. 조합

우선 조합이란 뭘까?

조합은 서로 다른 n개의 원소를 가지고 순서에 상관없이 r개의 원소를 선택하는 것 이다.

그래서 조합의 기호를 “nCr” 처럼 나타낸다.

만약 3C2 을 코드로 구현한다면 다음과 같은 인풋 아웃풋을 가질게 된다.

Input: [1, 2, 3]

Output: [ [1, 2], [1, 3], [2, 3] ]

이제 코드를 살펴보면 다음과 같다.

▷ 조합 알고리즘 구현

const getCombinations = (arr, num) => { const results = []; // nC1 이며, 1이면 의미 없기때문에 바로 반환한다. if (num === 1) return arr.map(v => [v]); arr.forEach((fixed, index, origin) => { // 조합에서는 값 순서에 상관없이 중복이 되면 안되기 때문에 현재값 이후의 배열들만 추출한다. const rest = origin.slice(index + 1); // 나머지 배열을 기준으로 다시 조합을 실시한다. // 기준값(fixed)이 있기 때문에 선택하려는 개수에서 – 1 을 해준다. const combinations = getCombinations(rest, num – 1); // 기준값(fixed)에 돌아온 조합(combinations)을 붙인다. const attached = combinations.map(v => [fixed, …v]); // 붙인 값을 결과 값에 넣어준다. results.push(…attached); }); return results; }

2. 순열

순열이란 뭘까?

순열은 서로 다른 n개의 원소를 가지고 중복 없이 순서에 상관있게 r개의 원소를 선택 혹은 나열 하는것 이다.

그래서 순열의 기호를 “nPr” 처럼 나타낸다.

만약 3P2 을 코드로 구현한다면 다음과 같은 인풋 아웃풋을 가질게 된다.

Input: [1, 2, 3]

Output: [ [1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2] ]

이제 코드를 살펴보면 다음과 같다.

▷ 순열 알고리즘 구현

const getPermutations = (arr, num) => { const results = []; // nP1 이며, 1이면 의미 없기때문에 바로 반환한다. if (num === 1) return arr.map(v => [v]); arr.forEach((fixed, index, origin) => { // 순열에서는 조합과 달리 순서만 바뀌면 중복이 아니기때문에 기준값을 제외한 나머지 배열을 넣어준다. const rest = […origin.slice(0, index), …origin.slice(index + 1)]; // 나머지 배열을 기준으로 다시 순열을 구한다. // 기준값(fixed)이 있기 때문에 선택하려는 개수에서 – 1 을 해준다. const permutations = getPermutations(rest, num – 1); // 기준값(fixed)에 순열(permutations)을 붙인다. const attached = permutations.map(v => [fixed, …v]); // 붙인 값을 결과 값에 넣어준다. results.push(…attached); }); return results; }

3. 중복순열

중복순열이란 뭘까?

중복순열은 서로 다른 n개의 원소를 가지고 중복을 허용하여 r개의 원소를 선택 혹은 나열 하는것 이다.

(중복을 허용한다는건 본인 숫자의 중복을 의미한다.)

만약 중복순열을 3개의 원소를 가지고 2개의 원소를 선택하도록 구현하면 아래와 같은 인풋 아웃풋이 출력된다.

Input: [1, 2, 3]

Output: [ [1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3] ]

이제 코드를 살펴보면 다음과 같다.

▷ 중복순열 알고리즘 구현

const getPermutations = (arr, num) => { const results = []; if (num === 1) return arr.map(v => [v]); arr.forEach((fixed, index, origin) => { // 기준값(fixed)이 있기 때문에 선택하려는 개수에서 – 1 을 해준다. const permutations = getPermutations(origin, num – 1); // 기준값(fixed)에 순열(permutations)을 붙인다. const attached = permutations.map(v => [fixed, …v]); // 붙인 값을 결과 값에 넣어준다. results.push(…attached); }); return results; }

중복순열은 기준 배열을 잘라 쓸 필요없이 전체 배열을 대상으로 한다.

4. 순열 기준 만들 수 있는 모든 경우의 수 추출

마지막으로 별거 아닌데, 위에서 설명한 순열, 중복순열, 조합의 경우 조합하려는 개수를 지정해 놔야 돌아가기 때문에 모든 경우의 수를 찾을수는 없다.

그래서 다른 방법이 있을지는 모르겠지만 위에서 설명한 순열 코드를 기준으로 모든 경우의 수를 뽑는 방법 에 대해 알아보자. (그냥 단순하게 반복문을 통해 함수를 실행시켜준것이다.)

const getPermutations = (arr, num) => { const results = []; if (num === 1) return arr.map(v => [v]); arr.forEach((fixed, index, origin) => { const rest = […origin.slice(0, index), …origin.slice(index + 1)]; const permutations = getPermutations(rest, num – 1); const attached = permutations.map(v => [fixed, …v]); results.push(…attached); }); return results; } const getAllPermutations = (arr) => { let results = []; arr.forEach((value, index, origin) => { results.push(…getPermutations(origin, index + 1)); }); return results; }

만약 3개의 원소를 가지고 만들 수 있는 모든 경우의 수를 추출하면 다음과 같이 출력된다. (일반 순열 기준)

Input: [1, 2, 3]

Output: [

[1], [2], [3],

[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2],

[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]

]

참고 : JavaScript로 순열과 조합 알고리즘 구현하기​

반응형

경우의 수, 합의 법칙, 곱의 법칙

방학이 다 끝나고, 2학기가 시작되었어요.

2학기에는 확률과 도형에 대해서 공부해요. 1학기 때 배웠던 연립방정식이나 함수와 다른 새로운 내용이니까 “기초가 부족해” 이런 생각하지 마세요. 처음 보는 단원이다 생각하고 열심히 하시면 됩니다.

처음으로 배울 내용은 확률인데 그 중에서도 경우는 수예요. 경우의 수는 간단히 말해서 주사위를 던지거나 동전을 던졌을 때 어느 면이 나오는지 그 수를 세보는 거예요.

경우의 수는 상식적인 선에서 생각해야 해요. 동전을 던졌을 때 세로로 서 있는 경우, 침대 밑으로 굴러가서 확인할 수 없는 경우 등은 전혀 고려하지 않아요.

경우의 수

사건은 같은 조건에서 여러 번 할 수 있는 실험이나 관찰로 얻어진 결과를 말해요. “동전을 던졌더니 앞면이 나왔다.” 같은 거요.

시행은 실험이나 관찰을 하는 행위를 말하고요.

경우는 수는 사건에서 일어날 수 있는 경우의 가짓수에요.

동전을 던지면 앞면이 나오는 경우가 있겠죠? 뒷면이 나오는 경우도 있을 거예요. 두 가지 경우가 있지요? 동전을 던질 때는 앞면 또는 뒷면이 나오는 두 가지 경우가 있어요. 따라서 이때의 경우의 수는 2에요.

주사위를 던지면 1, 2, 3, 4, 5, 6이 나올 수 있어요. 총 6가지죠. 따라서 이때의 경우의 수는 6이에요.

합의 법칙

경우의 수를 구하는 방법은 크게 두 가지에요. 그중에 첫 번째는 합의 법칙인데요.

한 개의 주사위를 던져서 2의 배수 또는 5의 배수가 나오는 경우의 수를 구한다고 해보죠.

주사위를 던져서 2의 배수가 나오는 경우는 2, 4, 6의 세 경우가 있어요. 경우의 수는 3이죠.

주사위를 던져서 5의 배수가 나오는 경우는 5 한 가지뿐이에요.

주사위를 던져서 2의 배수 또는 5의 배수가 나오는 경우는 3 + 1 = 4예요.

주사위를 던졌을 때 어떤 수가 나오는데, 2의 배수이면서 5의 배수인 경우가 있나요? 없죠? 그래서 각각의 경우의 수를 구해서 더해주는 거예요.

합의 법칙은 각 사건이 동시에 일어나지 않을 때 사용해요. 문제에서 ” 또는 “, “~ 이거나” 하는 표현들이 나올 때죠.

사건 A가 일어나는 경우의 수가 a가지

사건 B가 일어나는 경우의 수가 b가지일 때,

사건 A 또는 B가 일어날 경우의 수 = a + b(가지)

1 ~ 30까지의 자연수가 적힌 카드가 상자에 들어있다. 이 상자에서 카드를 한 장 꺼낼 때 5의 배수인 카드 또는 7의 배수인 카드가 나올 경우의 수는 몇 가지인가?

상자에서 카드를 꺼낼 때 5의 배수인 카드가 나오는 경우는 5, 10, 15, 20, 25, 30으로 6가지에요.

7의 배수인 카드가 나오는 경우는 7, 14, 21, 28로 4가지고요.

문제에서 “5의 배수인 카드 또는 7의 배수인 카드”라고 했으니까 두 경우의 수를 더해서 6 + 4 = 10, 총 10가지 경우가 되겠네요.

1 ~ 30까지의 자연수가 적혀있는 카드가 상자에 들어있다. 이 상자에서 카드를 한 장 꺼낼 때 3의 배수인 카드 또는 4의 배수인 카드가 나올 경우의 수는 몇 가지인가?

위의 예제와 같은 문제인데 숫자만 바꿨어요. 풀이가 어떻게 달라지는지 보죠.

상자에서 카드를 꺼낼 때 3의 배수인 카드가 나오는 경우는 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 총 10가지에요.

4의 배수인 카드가 나오는 경우는 4, 8, 12, 16, 20, 24, 28 총 7가지고요.

이 문제에서도 “3의 배수인 카드 또는 4의 배수인 카드”라고 했으니까 그냥 10 + 7 = 17하면 될까요?

안됩니다. 12가 적힌 카드를 뽑았다고 해보죠. 12는 3의 배수이면서 4의 배수예요. 12를 뽑은 건 하나의 사건인데 3의 배수인 카드를 뽑은 사건과 4의 배수를 뽑은 사건 양쪽에서 각각 더해주면 두 번을 세는 거예요. 그래서 한 번은 빼줘야 해요. 24도 마찬가지고요.

10 + 7 – 2 = 15, 이때의 경우의 수는 15가 돼요.

합의 법칙은 두 사건 중 하나만 일어나도 상관없을 때 각 사건이 일어나는 경우의 수를 더해줘요. 하지만 두 사건이 모두 일어나는(중복되는) 경우가 생기면 그만큼을 빼줘요.

곱의 법칙

1, 2, 3, 4가 적힌 카드 네 장이 있어요. 이 네 장의 카드를 이용해서 두 자리 자연수를 만드는 경우의 수는 몇 가지인지 알아보죠.

두 자리 자연수를 만든다고 했으니까 십의 자리 숫자 하나, 일의 자리 숫자 하나를 뽑아야 해요.

십의 자리 숫자로 1을 놓는다고 하면, 일의 자리 숫자는 2, 3, 4가 될 수 있어요. 경우의 수는 3가지네요.

십의 자리 숫자로 2를 놓는다고 하면, 일의 자리 숫자는 1, 3, 4가 될 수 있어요. 경우의 수는 3가지네요.

십의 자리 숫자로 3을 놓는다고 하면, 일의 자리 숫자는 1, 2, 4가 될 수 있어요. 경우의 수는 3가지네요.

십의 자리 숫자로 4을 놓는다고 하면, 일의 자리 숫자는 1, 2, 3이 될 수 있어요. 경우의 수는 3가지네요.

각각의 경우를 수를 다 더하면 3 + 3 + 3 + 3 = 12가 나와요.

이 문제를 쉽게 풀어볼까요?

십의 자리 숫자에 올 수 있는 수는 1, 2, 3, 4 해서 총 4개에요. 그리고 어떤 한 수를 십의 자리에 놓았을 때 일의 자리에 올 수 있는 숫자는 나머지 3개죠?

(십의 자리를 뽑는 경우의 수 4) × (일의 자리를 뽑는 경우의 수 3) = 12 하면 쉽게 구할 수 있죠?

곱의 법칙은 합의 법칙과 달리 사건이 동시에 일어나는 경우에 사용해요. 동시라는 같은 시각을 의미하는 게 아니에요. 경우의 수를 구하는 과정에서 두 사건이 모두 일어나야 한다는 뜻이에요.

십의 자리를 뽑는 것과 일의 자리를 뽑는 두 사건이 모두 일어나야 하죠? 십의 자리를 뽑는 사건과 일의 자리를 뽑는 사건 중 하나만 일어나서는 경우의 수를 구할 수 없어요. “동시에”라는 말은 여러 사건이 모두 일어나는 경우를 말해요.

이처럼 두 개 이상의 사건이 동시에 일어나면 각각의 경우의 수를 곱해요.

사건 A가 일어나는 경우의 수가 a가지

사건 B가 일어나는 경우의 수가 b가지일 때,

사건 A와 사건 B가 동시에 일어날 경우의 수 = a × b(가지)

3종류의 티셔츠와 2종류의 바지가 있다. 티셔츠와 바지를 하나씩 골라 입을 수 있는 경우의 수를 구하여라.

여기서는 3종류의 티셔츠 중 하나를 고르는 사건과 2종류의 바지 중에서 하나씩 골라 입는 경우의 수를 구하라고 했어요. 티셔츠를 고르는 사건과 바지를 고르는 사건은 동시에 일어나야 하는 하죠?

티셔츠를 고를 수 있는 경우의 수는 3, 바지를 고를 수 있는 경우의 수는 2에요.

따라서 옷을 입을 수 있는 경우의 수는 3 × 2 = 6(가지)가 되는 거죠.

합의 법칙과 곱의 법칙의 선택

어떤 두 사건이 있을 때 두 사건 중 하나만 일어나도 상관없으면 합의 법칙, 두 사건이 모두 일어나야 하면 곱의 법칙을 사용해요.

위의 1 ~ 30까지 자연수가 적힌 카드가 들어있는 상자에서 5의 배수 또는 7의 배수가 적힌 카드를 뽑는 경우의 수 예제를 보죠. 이때는 5의 배수가 적힌 카드가 나와도 괜찮죠. 그리고 7의 배수가 적힌 카드를 뽑아도 괜찮아요. 두 사건 중 하나만 일어나도 상관없으니까 합의 법칙이에요.

3종류의 티셔츠와 2종류의 바지에서 하나를 고르는 예제를 보죠. 티셔츠를 고르는 사건만 일어나거나 바지만 고르는 사건만 일어나서는 안 돼요. 두 사건 모두가 일어나야 해요. 그래서 곱의 법칙을 이용해서 경우의 수를 구해요.

합의 법칙: 여러 사건 중 하나만 일어나도 괜찮은 경우

곱의 법칙: 여러 사건이 모두 일어나야 하는 경우

함께 보면 좋은 글

[중등수학/중2 수학] – 경우의 수 공식 – 한 줄 세우기

[중등수학/중2 수학] – 경우의 수 공식 – 대표 뽑기

[중등수학/중2 수학] – 확률, 확률의 뜻, 확률 공식

[중등수학/중2 수학] – 확률의 성질, 여사건의 확률

정리해볼까요 경우의 수 사건이 일어날 수 있는 경우의 가짓수

합의 법칙: 두 사건이 동시에 일어나지 않을 경우의 수. 각각의 경우의 수의 합

곱의 법칙: 두 사건이 동시에 일어날 경우의 수. 각각의 경우의 수의 곱

그리드형(광고전용)

[알고리즘] 경우의 수를 푸는 순열, 조합 그리고 파스칼의 삼각형

경우의 수를 구하는 방법 중 기초가 되는 순열, 조합, 그리고 파스칼의 삼각형에 대해 알아보도록 하겠습니다.

먼저 순열, permutation이란 순서가 정해진 임의의 집합을 다른 순서로 섞는 연산을 말합니다. 그니까 1, 2, 3이렇게 있을 때 1, 3, 2 이런식으로 다른 순서로 섞는 연산을 순열이라고 합니다. 그리고 n 개의 집합 중 n 개를 고르는 순열의 개수는 n!이라는 특징을 가지고 있으며 보통 중복을 허용하지 않는 기본조건이 있습니다. 예를 들어 1, 2, 3을 이용해 만들 수 있는 자연수는 몇개 일까요? 1, 2, 3, 12, 13, 23, 123 이렇게 6개 입니다. 그리고 이 1, 2, 3 중에 1개를 뽑아서 만들 수 있는 자연수는 몇개일까요? 3개입니다.

[Algorithm] 순열(Permutation) 경우의 수 구하는 알고리즘 문제(feat. 재귀(Recursion) 함수 사용)

문제

입력값으로 임의의 수 N(1<=N)을 전달받는다. 1부터 N 까지의 숫자들로 구성된 임의의 배열을 생성하고, N개의 배열에서 N개의 요소를 출력할 때 가능한 경우의 수를 순열(Permutation)으로 출력하라. 입력값 1<=N 예제 예를 들어 N=3 인 경우 임의의 배열은 [1,2,3]이 된다. 이 배열에서 3개의 요소를 출력하는 경우의 수는 3! = 6가지가 나온다. [ '1 2 3' , '1 3 2', '2 1 3', '2 3 1', '3 1 2', '3 2 1' ]을 최종적으로 출력해야 한다. 풀이 ① 임의의 배열 startArr을 생성한다. ② 내부 재귀 함수를 생성한다. 재귀 함수 탈출 조건은 시작 시점 start와 배열 전체 길이 len이 같아지는 시점이다. 시작점 start 부터 시작해서 배열의 길이만큼 반복하고 시작지점 start와 현재 요소 i의 위치를 변경해 재귀 함수를 호출한다. 재귀 함수 호출 후 배열의 위치는 원위치 시킨다. ③ 결과값을 담은 resultArr를 반환한다. function permutationCase (N) { /* 작성자 : About-Tech 일자 : 2022-05-20 알고리즘 : 재귀 알고리즘 */ const startArr = []; const resultArr = []; for(let i=0; i{ // 재귀 탈출 조건 if(start === len){ resultArr.push(arr.join(“-“)); return; } // 재귀 로직 for(let i=start; i arr=[2,1,3]

– 이 과정이 “3-2-1″을 출력할 때 까지 반복된다. N이 3인 경우 총 15번의 재귀함수 호출이 발생한다.

1 번째 call stack 현재 start = 0 현재 i = 0 resultArr = ; 2 번째 call stack 현재 start = 1 현재 i = 1 resultArr = ; 3 번째 call stack 현재 start = 2 현재 i = 2 resultArr = ; 4 번째 call stack 현재 start = 1 현재 i = 2 resultArr = 1-2-3; 5 번째 call stack 현재 start = 2 현재 i = 2 resultArr = 1-2-3; 6 번째 call stack 현재 start = 0 현재 i = 1 resultArr = 1-2-3,1-3-2; 7 번째 call stack 현재 start = 1 현재 i = 1 resultArr = 1-2-3,1-3-2; 8 번째 call stack 현재 start = 2 현재 i = 2 resultArr = 1-2-3,1-3-2; 9 번째 call stack 현재 start = 1 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3; 10 번째 call stack 현재 start = 2 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3; 11 번째 call stack 현재 start = 0 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3,2-3-1; 12 번째 call stack 현재 start = 1 현재 i = 1 resultArr = 1-2-3,1-3-2,2-1-3,2-3-1; 13 번째 call stack 현재 start = 2 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3,2-3-1; 14 번째 call stack 현재 start = 1 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3,2-3-1,3-2-1; 15 번째 call stack 현재 start = 2 현재 i = 2 resultArr = 1-2-3,1-3-2,2-1-3,2-3-1,3-2-1;

정리

순열은 순서를 고려한 경우의 수를 출력한다. 위 문제에서는 모든 경우의 수를 출력하는 문제인데, 재귀 알고리즘을 사용했다. 핵심은 현재의 위치를 임의로 변경하면서 재귀 탈출 조건을 찾아나가는 과정이다. 이 간단해 보이는 문제를 푸는데 5시간이 넘게 걸렸다.

재귀 함수는 클로져 함수로 생성했다. 재귀 함수를 생성할 때 가장 중요한 건, 탈출 조건이다. 이번 문제에서는 시작지점이 함수의 총 길이와 같아지는 시점, 즉 모든 배열의 요소 순회를 마쳤을 때로 지정했다.

재귀 함수에 익숙해지는 방법은 다양한 케이스를 풀어보는 수 밖에 없다. Call Stack에 어떤 함수가 쌓이고 있고, 현재 어떤 로직인지 해결이 안되면 Chrome Debuging Tool을 사용하는 방법도 있다.

Reference

[경우의 수] 순열, 조합, 중복 순열

이번엔 경우의 수를 구하는 순열, 조합, 중복순열에 대해서 알아보겠습니다. 여러분이 많이 알고 있는 경우의 수구하는 알고리즘인데, 이를 넘어서 해당 성분들까지 구해보는 경우를 구해봅시다!!

순열(Permutation)

먼저 순열이 어떤 건지 알아봅시다. 기호로 표현하면 nPr이라고 표현합니다. 해석하자면 n개의 성분에서 r개를 뽑아 나열시킨 경우의 수가 되겠네요.

대표적인 예로 줄 세우기가 될텐데, 순열은 방향성이 있는 경우의 수입니다. 즉 123이랑 321은 다르다는 거죠.

먼저 순열의 경우의 수를 구하는 식을 보면 이러합니다.

한번 구현해보기에 앞서서 순열이 데이터를 선택하는 절차를 보면 이렇게 되겠죠.

그림처럼 선택된 데이터를 제외한 리스트에서 다른 데이터를 가져오는 방식으로 데이터가 선택됩니다.

제가 여기서 겪은 문제점은 어떻게 선택된 놈을 제외시키지 였습니다. 뭐 그냥 노가다로 지울 수도 있었고, 조건문 으로도 지울 수 있었는데, 감이 안오더라구요.. 그래서 이리저리 검색을 하니까 선택된 데이터는 맨 끝으로 보내버리기를 사용 하더라구요.

void Permutation(int n, int r) { if(r == 0){ perm.push_back(T); return; } for(int i = n-1; i>=0; i–) { swap(&data[i], &data[n-1]); T.push_back(data[n-1]); Permutation(n-1, r-1); T.pop_back(); swap(&data[i], &data[n-1]); } }

그림으로 보면 조금 더 이해가 될 수도 있는데, i가 2일 때 맨 끝번호랑 순서를 바꾸고 다시 함수 call로 들어가서 i가 1번일 때 검색하는 내용입니다.

그리고 vector T에 해당 성분을 집어넣고 함수 호출이 끝나면 집어 넣었던 성분을 pop하고 다시 원위치로 돌리는데,

그 이유는 for loop를 돌 때, 해당 loop 다음 loop는 함수 호출이 되었을 때의 성분을 사용해야 하기 때문에 원상태로 돌려놓는 것입니다.

순열의 경우의 수 공식은 위에 사진으로 보았듯이 n부터 1씩 차감하면서 r개 곱하면 끝! int PermutationAmount(int n, int r) { int result = 1; for(int i=0; i=0; i–){ swap(&data[i], &data[n-1]); T.push_back(data[n-1]); RP(n, r-1); T.pop_back(); swap(&data[i], &data[n-1]); } } 이해가 되시나요? 다른 것은 선택된 놈도 다시 선택될 수 있다는 것!! 이렇게 되겠네요 그럼!! 겁나 간단!! 아 물론 위의 기본 nCr공식을 사용해도 됩니다.이번엔입니다!! 사실 이거 공부하려고 했다가공부함. 중복 순열은. 그럼코드에서 다른건 뭐가 될까요?? 순열을 구현할 때가 선택 되지 말라고 스와핑하고 인덱스에서 검색 못하게 순번을 차감해서했던 것을 없애면 되겠네요!!이해가 되시나요? 다른 것은 선택된 놈도 다시 선택될 수 있다는 것!!

그럼 swap은 왜 안 빠졌을 까요? 순열은 본래가 순서가 중요하기 때문이에요. 즉, 같은 1이어도 다른 순서면 다른 값이라는 거죠. 그렇기 때문에 순서을 바꿔주기 위한 swap이 되겠습니다!! 3 코드 모두 vector T를 만들고 2차원 vector인 perm, com에 저장하는데, 이는 경우를 저장하기 위한 것입니다! 코드는 아래에 있습니다! 중복 순열 순열 조합

먼저 i를 0부터 돌려서 마지막에 if(i==n)을 주기보단 그냥 맨 끝부터 돌리면 편하니까 for loop를 저렇게 줬고, i번째 데이터가 선택이 되면 그 데이터는 뒤로 보내고 다시 recursion해주면 선택된 값이 뒤로 사라져서 검색을 안하게 되고… 이해가 되셨나요??

키워드에 대한 정보 경우 의 수 알고리즘

다음은 Bing에서 경우 의 수 알고리즘 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리)

  • 곱의법칙
  • 곱의 법칙
  • 합의법칙
  • 합의 법칙
  • 팩토리얼
  • 팩토리얼 개념
  • 팩토리얼 계산
  • 순열조합
  • 순열
  • 조합
  • 순열 조합
  • 같은 것이 있는 순열
  • 원순열
  • 최단거리 길찾기
  • 중복순열
  • 중복조합
  • 분할
  • 집합의 분할
  • 자연수의 분할
  • 이항정리
  • 경우의 수
  • 경우의수
  • 경우의수공식
  • 경우의 수 총정리
  • 중간고사
  • 수학 총정리
  • 확률과통계
  • 확통개념
  • 여러가지 순열
  • 최단 경로

경우의 #수 #공식들 #한번에 #총정리 #해드립니다 #/ #확률과통계 #/ #확통공식1 #(곱의법칙, #합의법칙, #팩토리얼, #순열, #조합, #원순열, # #중복순열, #중복조합, #분할, #이항정리)


YouTube에서 경우 의 수 알고리즘 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 경우의 수 공식들 한번에 총정리 해드립니다 / 확률과통계 / 확통공식1 (곱의법칙, 합의법칙, 팩토리얼, 순열, 조합, 원순열, 중복순열, 중복조합, 분할, 이항정리) | 경우 의 수 알고리즘, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  이탈리아 배 대지 | 유럽 구매대행 발주 가상 체험하기!!! 아마존 직배송 Vs 배대지(배송대행지) 결국 어느방법을 이용해야할까? / 박스 언박싱까지~ 279 개의 새로운 답변이 업데이트되었습니다.

Leave a Comment