내가 헷갈렸던 것들
.slice(first, end) !== .splice(first, num)
: slice는 first부터 end-1까지 복사
: splice는 first부터 num만큼 자르기
push,pop,shift : mutable, 반환하는 값은 각각 길이 또는 사라지는 값
반복문을 이용해 순열과 조합 만들기
중복 순열
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++){
result.push(lookup[i], lookup[j], lookup[k])
}
}
}
중복 순열
3개 중 2개 뽑아서 중복 순열 만들기
: lookup 중에 2개 뽑아서 나열한다
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]
result.push([pick1, pick2]);
}
}
return result;
}
순열
3개 중 3개를 뽑아서 순열을 만들기
: 인덱스끼리 같은게 있으면 안되니까 같으면 push를 하지 않는다
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;
// ||는 첫번째 요소가 true면 두번째 요소부터 보지 않는다
result.push(lookup[i], lookup[j], lookup[k]);
}
}
}
return result;
}
조합
3개 중 2개를 뽑아서 조합을 만들기
: 순서가 상관이 없으니까 i를 이용해서 result에 넣으면 또 넣을 필요 없다
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]);
}
}
}
중복 순열
3개 중 3개 뽑아서 중복 순열 만들기
let result=[];
const 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];
//pick = 1
recursion(count-1, bucket.concat(pick));
//concat으로 쓰는 이유 : push는 전체 배열의 길이 반환
i=0일 때
//recursion(2, [1])
//recursion(1, [1,1])
//recursion(0, [1,1,1]) -> result = [[1,1,1]]
i=1일 때
pick=2
recursion(2, bucket.concat(2))[2]
//i=0 : recursion(1, bucket.concat(1)) [2, 1]
//-> recursion으로 들어와서 :i=0 recursiont(0, bucket.concat(1)) [2,1,1]
// -> count===0이므로 result에 bucket push
}
}
recursion(3, []);
Pick Or Not
const elements = ["가", "나", "다", "라"];
const pickOrNot = (idx, basket) => {
if(idx === element.length){
console.log(basket)
return;
}
pickOrNot(idx+1, basket.concat(elements[idx]));
pickOrNot(idx+1, basket);
};
pickOrNot(0, []);
조합 template
const Combinations = (arr, selectNumber) => {
if(selectNumber ===1) return arr.map((v) => [v])
//1개만 뽑는거면 모두 [] 씌우면 된다
const result=[];
arr.forEach((v, idx) => {
const rest = arr.slice(idx+1);
//하나의 value를 선택하면 그것을 다시 선택할 수 없다
//idx=2일 때는 idx=1, 2 둘다 제외한다
//3부터 rest로 넣어서 selectNumber가 1일 될 때까지 작아지고
그다음에 거꾸로 올라오면서(rest+1, selectNumber+1) 각 요소당 v추가
const restCombination = Combiations(rest, selectNumber-1);
//한 개 적게 선택했을 때
const attached = restCombinations.map((combination) => [v, ...combination]
//앞에 v만 넣는다 (v는 arr의 요소들)
}
}