2행시
순 : 순대국
열 : 열라 맵게 해줘요
조 : 조조영화랑 팝콘이랑
합 : 합치면 만원
어떤 나열을 하는 문제를 해결할땐 [___]가 있느냐 없느냐가 제일 중요하다!
정답은 댓글로
순서가 있는 나열이 순열 입니다.
영어론 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개
요소를 여러번 사용해서, 순서가 있게 나열해라
[1,2,3,4,5] 중에
요소를 순서대로 나열하시오. (요소가 중복되도 됨)
[1,1,1][2,2,2]
..
..
..(생략)
5 X 5 X 5 = 125개
순서랑 상관없이 나열하는것. (combination)
[1,2,3,4,5]
3개를 순서와 상관없이 나열하시오.
[1,2,3][1,2,4]
..(생략)
(5x4x3x2x1) / (2x1)(3x2x1) = 10개
먼저 순열, 중복순열, 조합 중에 어떤걸로 풀어야 할지 고민할것
가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임입니다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.
let output = rockPaperScissors();
console.log(output);
/*
[
["rock", "rock", "rock"],
["rock", "rock", "paper"],
["rock", "rock", "scissors"],
["rock", "paper", "rock"],
// ...etc ...
]
*/
가위 바위 보를 낼 때 낸 사람 마음대로이니 굳이 순서는 필요없다.
(순열)
다 같이 똑같은걸 내도 되니 (중복)
(중복 + 순열)
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
}
순서