순열, 중복순열, 조합

LEE JI YOUNG·2021년 11월 10일
0

중복순열(permutation with repetition)

  • 중복 O, 순서 O
  • 중복을 허용하는 순열 (조합과 다르게 순서가 있음)
    : 3개 중 3개로 요소의 중복을 허용하고 순서를 부여하여 조합할 수 있는 모든 경우의 수
// for문 이용 중복순열 예시1
function forloop(){
  let result = [];
  let lookup = [1, 2, 3];
  
  for(let i = 0; i < 3; i++){
  	let pick1 = lookup[i];
    for(let j = 0; j < 3; j++){
      let pick2 = lookup[j];
      for(let k = 0; k < 3; k++){
        let pick3 = lookup[k];
          result.push([pick1, pick2, pick3]);
      }
    }
  }
  return result; 
}
// for문 이용 중복순열 예시2
function forloop(){
  let result = [];
  let lookup = [1, 2, 3];
  
  for(let i = 0; i < 3; i++){
    for(let j = 0; j < 3; j++){
      for(let k = 0; k < 3; k++){
          result.push([lookup[i], lookup[j], lookup[k]]);
      }
    }
  }
  return result; 
}
// 재귀이용 중복순열 예시
let result = [];
let lookup = [1, 2, 3];

function recursion(count, bucket){
  if(count === 0){
    result.push(bucket);
    return;
  }
  for(let i = 0; i < 3; i++){
  	const pick = lookup[i];
    recursion(count - 1, bucket.concat(pick));
  }
}

recursion(3, []);

순열(permutation)

  • 중복 X, 순서 O
  • 중복없는 순서있는 배열
    : 3개 중 3개로 요소의 중복없이 순서를 부여하여 조합할 수 있는 모든 경우의 수
// for문 이용 순열 예시
function forloop(){
  let result = [];
  let lookup = [1, 2, 3];
  
  for(let i = 0; i < 3; i++){
    for(let j = 0; j < 3; j++){
      for(let k = 0; k < 3; k++){
		  if(i === j || j === k || k === i) continue;
          //continue는 다음식 진행안하고 증감식으로 넘어감.(k:0 -> k:1) 
          result.push([lookup[i], lookup[j], lookup[k]]);
      }
    }
  }
  return result; 
}
// 재귀이용 순열 예시1
let result = [];
let lookup = [1, 2, 3]; 

function recursion(count, bucket){
  if(count === 0){
    if(bucket[0] !== bucket[1] && bucket[1] !== bucket[2] 
       && bucket[0] !== bucket[2]){
      result.push(bucket);
    }
    return;
  }
  for(let i = 0; i < 3; i++){
    const pick = lookup[i];
    recursion(count-1, bucket.concat(pick));
  }
  return result; 
}

console.log(recursion(3, []))
/*
// 재귀이용 순열 예시2
let result = [];
let lookup = [1, 2, 3]; 

function recursion(count, bucket){
  if(count === 0){
    result.push(bucket);
    return;
  }
  for(let i = 0; i < 3; i++){
    if(bucket.includes(lookup[i])) continue;
    const pick = lookup[i];
    recursion(count-1, bucket.concat(pick));
  }
  return result; 
}

console.log(recursion(3, []))
/*

조합(combination)

  • 중복 X, 순서 X
  • 그룹을 만드는 것
    : 3개 중 2개로 요소의 중복없이 조합하는 모든 경우의 수
// for문 이용 조합 예시
function forloop(){
  let result = [];
  let lookup = [1, 2, 3];
  
  for(let i = 0; i < 3; i++){
    for(let j = i + 1; j < 3; j++){
        result.push([lookup[i], lookup[j]]);
    }
  }
  return result; 
}
// 재귀이용 조합 예시
let result = [];
let lookup = [1, 2, 3];

function recursion(count, bucket, k){
  if(count === 0){
	result.push(bucket);
  	return;
  }
  for(let i = k; i < 3; i++){
    const pick = lookup[i]
    recursion(count-1, bucket.concat(pick), ++k);
  }
  return result
}

recursion(2, [], 0)
profile
프론트엔드 개발자

0개의 댓글