for반복문으로 순열, 조합, 중복순열 이해해보기

YS_Study.log·2022년 3월 3일
0

=> 조합,순열,중복순열 개념 설명

배열 [1,2,3] 3개의 요소를 활용하여 조합, 순열, 중복순열의 기본 동작을 알아본다.

  • 공통적인 것들
    - 총 요소의 개수 : N개
    - 조합할 경우의 수 : R개
    - for 반복문의 개수 === R개와 동일하다.

중복순열 templates

  • 중복이 된다는 특징 & 순서를 신경쓴다는 특징(같은 요소들이 순서가 바뀐 경우의 수도 포함)을 생각하기

ex) for 반복문) 3개 중 3개를 뽑아 중복순열 만들기

  • result에 담기는 중복순열 경우=> 이런방식 [[1,1,1],[1,1,2],[1,1,3], [1,2,1]...]
    => 1,1 같은 요소의 중복이 가능하고, 123 같은요소들이 순서가 바뀌면 다른 경우의 수로 취급한다.
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;
}

순열 templates

  • 중복이 안된다는 특징 & 순서를 신경쓴다는 특징(같은 요소들이 순서가 바뀐 경우의 수도 포함)을 생각하기

ex) for 반복문) 3개 중 3개를 뽑아 순열만들기

  • 중복순열이랑 동일하게 for문의 범위는 동일하지만, 이 부분만 다르다!
    순열을 중복이 안되기 때문에 i,j,k 중 두개의 인덱스만 같을 경우를 걸러준다.
    continue 같은 요소인 경우 다음 로직을 실행하지 않고 넘어간다.
 if (i === j || j === k || k === i) continue;
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;
    	result.push([lookup[i],lookup[j],lookup[k]])
      }
    }
  }
  return result;
}

조합 templates

  • 중복이 안된다는 특징 & 순서는 신경쓰지 않는다는 특징

ex) for 반복문) 3개 중 2개를 뽑아 조합만들기

(3개를 뽑거나, 1개를 뽑는 경우의 수는.. 3개는 1개, 1개는 3개가 나오기에 할 의미가 없다.)

  • 조합이 순열과 다른점 : 순서!
  • 내부 for문) j = i + 1; 부터 반복을 시작하는 부분이 다르다.
    => 중복과 순서때문! 중복은 사실 순열 템플릿 처럼 걸러주면 되지만
    => 순서무시: [1,2][2,1] 이렇게 나오면 안되기때문!
// 순서가 뒤집히는 요소가 나오지 않는 것을 보여주는 과정 예시
// i와 j가 3 미만, 즉 인덱스 2번째 요소 까지만 반복문돌린다.
i=0  배열의 0번째 요소 "1"
j=i+1 배열의 1번째 요소 2 [1,2]
j=i+1 배열의 2번째 요소 3 [1,3]
result.push([lookup[i], lookup[j]])=> [[1,2],[1,3]]

i=1 배열의 1번째 요소 2
j=i+1 배열의 2번째 요소 3 => [2,3]
result.push([lookup[i], lookup[j]]) => [[1,2],[1,3],[2,3]]
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;
}

profile
느리지만 조금씩 공부하는 중 입니다. 현재 1년 6개월차 신입입니다 ><!

0개의 댓글