카테고리 없음

경우의 수

코딩하는둥이 2025. 3. 26. 18:00

완전탐색으로 경우의 수를 푸는 알고리즘

 

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

    3개의 알파벳으로 단어를 만드는 경우의 수 

 

for문을 사용하면 3번중첩되기 때문에 좋은 코드가 될 수 없다

let input -["a", "b", "c"]
let count = 0;

function permutation(arr){
	// for i -> 첫번째 index 위치시킬 요소 a,b,c [i,0,0]
    for(let i = 0; i < arr.length; i++){
		//for j =>  두번째 index 위치시킬 요소[i,j,0]
    	for(let j = 0; k <arr.length; j++){
        	if(i ==j) continue;
            // for k => 세번째 index위치시킬 요소 [i, j,l]
            if(i == k) continue;
            if(j == k) continue;
            
            condole.log(arr[i], arr[j], arr[k]);
        }
    }
}

permutation(input)

 

 

그래서 재귀함수를 사용합니다.

let input -["a", "b", "c"]
let count = 0;

function permutation(arr,s,r){
	//1. 재귀 함수를 멈춰야할 조건
    if(s == r){
    	count++;
        console.log(arr);
        return;
    }
    
    //2. 재귀를 돌면서 변경되어야 될 부분 . 메인 로직
	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)

 

 

 - 조합 : 서로 다른 n개의 원소중에서 r를 중복없이 골라 순서에 상관없이 나열하는 경우의

4개의 숫자 카드에서 2개를 뽑는 경우의 

 

for문을 사용하면 2번 중첩되기 때문에 좋은 코드가 될 수 없다

let input = [1,2,3,4]
let count = 0;

function combination(arr){
	//for-> 뽑는 개수 
    for(let i = 0; i < arr.length; i++){
    	for(let j = 1; i < arr.length; j++){
        	count++;
        }
    }
}

combination(input);


그래서 재귀함수를 사용합니다.

let input = [1,2,3,4]
let count = 0;
let output = [];

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++) {
    	data[s] = arr[i];
        combination(arr, data, s+ 1, i + 1, r);
    }
}

combination(input, output, 0, 0, 2);

 

 

점화식 : 수열에서 이웃하는 두 개의 항 사이에 성립하는 관계를 나타낸 관계식

등차수열 F(n) = F(n-1) + a

등비수열 F(n) = F(n-1) * a

팩토리얼 F(n) = F(n-1) * n

피보나치 수열 F(n) = F(n-1) +  F(n-2)

 

등차수열 예제 - 1

let result;
function forloop(s, t, number){
	let arr = 0;
    
    for(let i = 1;  i <= number; i++){
    	if(i == 1)
        	acc += s
        else
        	acc += t;
        console.log(i, acc);
     }
   return acc;
 }
 result = forloop(3,2,5)
 console.log(result);

 

더보기

1 3

2 5

3 7

4 9

5 11

11 

 

재귀함수

let result;
function recursive(s, t, number){
    if(number == 1)
        return s;
 	}
   return recursive(s,t, number-1) + t;
 }
 result = forloop(3,2,5)
 console.log(result);
더보기

1 3

2 5

3 7

4 9

5 11

11 

 

등비수열 예제 - 1

let result;
function forloop(s, t, number){
	let arr = 0;
    
    for(let i = 1;  i <= number; i++){
    	if(i == 1)
        	acc *= s
        else
        	acc *= t;
        console.log(i, acc);
     }
   return acc;
 }
 result = forloop(3,2,5)
 console.log(result);

 

더보기

1 3

2 6

3 12

4 24

5 48

48

 

재귀함수

let result;
function recursive(s, t, number){
    if(number == 1)
        return s;
 	}
   return recursive(s,t, number-1) * t;
 }
 result = recursive(3,2,5)
 console.log(result);
더보기

1 3

2 6

3 12

4 24

5 48

48

 


팩토리얼 예제 - 1

 

재귀함수

let result;
function recursive(number){
    if(number == 1)
        return s;
 	}
   return recursive(number - 1) * number;
 }
 result = recursive(5)
 console.log(result);
더보기

 

120

 

피보나치 수열 예제 - 1

 

재귀함수

let result;
function recursive(number){
    if(number == 1 || number ==0)
        return number;
 	}
   return recursive(number - 1) + recursive(number - 2);
 }
 result = recursive(5)
 console.log(result);

 

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