[JS알고리즘] 일곱난쟁이
in Algorithm
일곱난쟁이의 키의 합이 100인데 자신이 원래 ‘일곱난쟁이’였다며 주장하는 난쟁이가 9명이 되었다. 원래 7명의 난쟁이와 아닌 2명의 난쟁이를 구별하여라
function solution(arr){
let answer = arr;
let sum = arr.reduce((a,b)=>a+b,0);
for(let i=0; i<8; i++){
for(let j=1; j<9; i++){
if( (sum - (arr[i]+arr[j])) == 100){
arr.splice(j,1);
arr.splice(i,1);
}
}
}
return answer;
}
let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr))
9개의 숫자를 총 더한 값을 sum이라고 가정하고, 2중for를 돌려 sum
에서 arr[i]+arr[j]
를 뺀 값이 100이 되는 경우를 작성하면 된다
reduce
함수는 값을 누적해주는 함수인데 arr에서 인자들을 더한 값(누적값)을 a에 저장하고 b는 새로운 인자를 받아오게 된다.
그러니까 arr의 누적값을 구할 수 있다. 마지막 인자 0은 초기에 a의 값을 0으로 초기화 하라는 것이다
for(let i=0; i<8; i++){
은 arr를 돌게되는 첫번쨰 for문으로 8까지만 돌면되므로 9번까지 돌지 않아도 된다. 0번째 인덱스로 시작해서 숫자8의 인덱스 값은 8번 인덱스이기 때문에 8번만큼 돌아야 한다.
그 다음 for는 for(let j=1; j<9; i++){
첫번째 시작값이 1로 시작하고 13번숫자의 인덱스인 9번까지 돌아야 하므로 9까지 돌면된다.
이후 조건문으로 sum에서 arr[i]+arr[j] 을 뺀 값이 100이 될때를 걸러준다.
splice(x,y)
함수는 원하는 인덱스(x)의 값을 y째 자리만큼 지우라는 뜻이다.
조건문으로 걸고나서 splice함수로 가짜 난쟁이 2개를 제거해주려고 하는데,
arr.splice(i,1);
arr.splice(j,1);
위 코드대로 i를 먼저 제거한 후 콘솔에 찍으면 ` [20, 7, 23, 19, 10, 25, 13]` 로 다른 값이 출력된다.
(원래 15와 25가 제거되어야 함)
이유는 15를 제거하면서 arr의 인덱스 값이 변경되기 때문인데 5번쨰 인덱스 값(15)을 삭제하면 뒤 인자인 25, 8, 13의 인덱스가 하나씩 당겨지면서
삭제해야할 25의 인덱스인 6번째 인덱스가 5번째 인덱스가 되어버리므로 6번 인덱스의 값인 8이 삭제되어버리는 것이다
그래서 순서를 바꿔 j번째 인덱스를 먼저 삭제해주고 그 다음에 i번째 인덱스를 삭제해주면 인덱스의 변동없이 값을 제거할 수 있게 된다.
inflearn 자바스크립트 알고리즘 강의 내용 =)