순열 / 조합 정리

야 나 개 ·2021년 12월 13일
0
post-thumbnail

2행시

순 : 순대국
열 : 열라 맵게 해줘요


조 : 조조영화랑 팝콘이랑
합 : 합치면 만원


어떤 나열을 하는 문제를 해결할땐 [___]가 있느냐 없느냐가 제일 중요하다!
정답은 댓글로

개념

1.순열

개념

순서가 있는 나열이 순열 입니다.
영어론 Permutation (퍼뭇테이션)

순서가 있다.
순서가 있다.
순서가 있다.

공식

nPr = n(n-1)(n-2-)....(n-r+1)
n! / (n-r)!

예제

[1,2,3,4,5]
중에
배열의 요소 3개를 뽑아서 순서대로 나열하시오.

[1,2,3][1,2,4]
[1,2,5][2,3,4]
...(생략)
[3,4,5]

5x4x3 = 60개

2.중복순열

개념

요소를 여러번 사용해서, 순서가 있게 나열해라

공식

예제

[1,2,3,4,5] 중에
요소를 순서대로 나열하시오. (요소가 중복되도 됨)

[1,1,1][2,2,2]
..
..
..(생략)

5 X 5 X 5 = 125개

3.조합

개념

순서랑 상관없이 나열하는것. (combination)

공식

예제

[1,2,3,4,5]
3개를 순서와 상관없이 나열하시오.

[1,2,3][1,2,4]
..(생략)

(5x4x3x2x1) / (2x1)(3x2x1) = 10개

먼저 순열, 중복순열, 조합 중에 어떤걸로 풀어야 할지 고민할것

1번 문제

가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임입니다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.

예시

let output = rockPaperScissors();

console.log(output);
/*
    [
      ["rock", "rock", "rock"],
      ["rock", "rock", "paper"],
      ["rock", "rock", "scissors"],
      ["rock", "paper", "rock"],
      // ...etc ...
    ]
  */

생각하기

  1. 가위 바위 보를 낼 때 낸 사람 마음대로이니 굳이 순서는 필요없다.
    (순열)

  2. 다 같이 똑같은걸 내도 되니 (중복)

(중복 + 순열)
PPAP .. 팬파인애플애플팬

3.중복순열을 푸는데는 반복문 vs 재귀함수
-> 둘중에 자신이 있는거 사용하삼!!

4.가위 바위 보 중에 내는거니까 3중 반복문 사용하면 됨

첫번째 풀이

3중 반복문을 사용해서 작성 해봄
귀여움? ㅋㅋㅋㅋㅋ

function rockPaperScissors () {
  // TODO: 여기에 코드를 작성합니다.
  //
  const rps = ['rock', 'paper', 'scissors'];
  let result = [];
  for(let i = 0; i < rps.length; i++){
    for(let j = i + 1; j < rps.length; j++){
      for(let k = j + 1; k < rps.length; k++){
        result.push([rps[i], rps[j], rps[k]])
      }
    }
  }
  return result;
};

두번째 풀이

내장함수에 재귀를 사용해서 만들어 봅시다.

먼저 한가지 패턴은 이해 합시다.

재귀함수편

const make = (a,b) => {
    if(탈출조건){

    } else {
      (탈출을 위해 반복조건)
    }
  }
function rockPaperScissors ( rounds ) {
  // TODO: 여기에 코드를 작성합니다.
  rounds = rounds || 3;
  let result = [];
  let rps = ['rock', 'paper', 'scissors'];
  //재귀함수 만들기 
  const make = (num, arr) => {
    // 탈출조건은 더이상 조합하지 않는수가 될때 밖으로 나간다. 
    if(num === 0){
      // 그리고 재귀함수로 만든 배열을 결과값에 푸쉬를 한다.
      result.push(arr);
      return;
    } else { 
      for(let i = 0; i < rps.length; i++){
        //재귀함수를 사용한다. 이번엔 값을 합쳐줄땐 concat을 사용한다. 
        //push는  그 값 자체를 반환 한다.그래서 콘켓을 해줘야 한다.
        make(num - 1, arr.concat(rps[i]))
      }
    }   
  }
  //가위바위보 만드는 함수를 사용한다.
  make(rounds, []);
  return result;
};

무작정 문제 풀기!!!

대표적인 문제 준비 했어

일곱난쟁이

신데렐라가 일과를 마치고 집에 돌아오니
일곱난쟁이가 있는게 아닌
9명의 난쟁이가 있었다.
(......하)

찐 일곱난쟁이를 찾아야한다.
신데렐라는 알고 있었다. 7명의 난쟁이키를 전부 더하면 100이 딱 된다.

그럼 찐 난쟁이를 찾아보자!!

▣ 출력설명
입력된 순서대로 일곱 난쟁이의 키를 출력한다.

▣ 입력예제
20 7 23 19 10 15 25 8 13

(신데렐라는 페이크다! ㅋㅋ)

생각하기

i번째 + j번째를 총합에서 빼서 100이 됐을때 !!
걔네들이 가짜 난쟁이다!!!

그럼 해당되는건 빼주세요.!!!

그럼 코드로 구현해봅시다!

문제풀이

function solution(arr){
  let answer = arr;
  // 얕은복사 참조형자료는 주소값만 복사한다.
  let sum = arr.reduce((acc,cur) => acc + cur,0);
  console.log(sum)
  for(let i = 0; i < arr.length - 1; i++){
     for(let j = i + 1; j < arr.length; j++){
        console.log(arr[i], arr[j])
         if((sum - (arr[i] + arr[j])) === 100){
              answer.splice(j, 1);
              answer.splice(i, 1);
          }
     }
  }
           
  return answer
 }
           

profile
야 나도 개발자 될 수 있어

1개의 댓글

comment-user-thumbnail
2021년 12월 17일

순서

답글 달기