자바스크립트 알고리즘 문제풀이 - 8
코딩테스트를 대비하여 문제를 한개씩 풀어보는 게 좋을 것 같아서 인프런 강의를 구매했다.
매일은 아니더라도 꾸준히 공부해서 실력을 키워나가야지…!
Lst’s GO…!
문제 : 아홉 명의 난쟁이는 모두 자신이 “백설 공주와 일곱 난쟁이”의 주인공이라고 주장했다.
뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.
입력예제1 : 20 7 23 19 10 15 25 8 13
출력예제1 : 20 7 23 19 10 8 13
이번 문제는 사실 해결방법을 생각해내는 게 조금 어려웠다.
아무리 머리를 굴려도 생각이 나지 않아서, 겨우 생각해낸 방법은
조금 비효율적이긴 하지만… 난쟁이의 키를 배열로 받았을 때, 7개의 인덱스 숫자를 랜덤으로 받아서
그 인덱스에 해당하는 수끼리 합했을 때 100이 될 때까지 반복문을 돌리는 것이었다.
100이라는 수가 나오면 그 수들을 다른 배열(arr2)에 저장해놓는다.
그 뒤, 입력된 순서에 맞춰 arr2에 해당 숫자가 있는지 검사한 후에 최종 answer 배열에 그 값을 넣는 작업을 반복했다.
내가 푼 내용
function mySolution(arr){
let arr2 = [];
let answer = [];
let sum=0;
let random;
while(sum!=100){
sum = 0;
arr2 = [];
for(let i=0; i<7; i++){
random = Math.floor(Math.random() * 9); //인덱스 랜덤으로 생성
sum += arr[random];
if(arr2.indexOf(arr[random])!=-1){ //중복 제거
i--;
}else{
arr2.push(arr[random]);
}
}
}
for(let i=0; i<arr.length; i++){ //입력된 순서대로 정렬
if(arr2.indexOf(arr[i])!=-1){
answer.push(arr[i]);
}
}
return answer;
}
정답코드를 보자…!
function solution(arr){
let answer=arr;
let sum=answer.reduce((a, b)=>a+b, 0);
for(let i=0; i<8; i++){
for(let j=i+1; j<9; j++){
if((sum-(answer[i]+answer[j]))==100){
answer.splice(j, 1);
answer.splice(i, 1);
}
}
}
}
정답 코드를 보고선 내가 놓친 부분이 많았다는 것을 깨달았다.
우선 reduce 함수를 이용해서 배열의 모든 숫자들을 누적한다.
그런 다음 앞에 있는 수부터 차례대로 두개씩 뽑아서 (어차피 난쟁이가 아닌 애들은 두개뿐이니..)
그 두개의 합을 누적합에서 뺀다.
그랬을 때, 100이 되면 앞에서 구한 두 개의 숫자가 난쟁이가 아닌 수…!
그 값만 배열에서 splice로 빼면 된다.
내가 혼자서 생각할 때, 제일 고민을 했던 부분이 두가지가 있었는데
하나는 바로, 합을 100이 될 때까지 어떻게 구하느냐였고,
두번째는 바로, 그 두가지 수를 어떻게 구하느냐였다.
반복문을 이용해서 모든 수에 차례대로 접근할 수 있다는 당연한 사실을 너무나 바보같이 간과하고 있었다….ㅠㅠ
그렇지만, 모든 수의 총 합 - 반복문에서 구한 두 수의 합 이라는 방법을 생각지는 못했다.
for문에 대해서 다시금 생각해보게 하는 문제였다…!!
항상 기본에 충실하잡…ㅠ_ㅜ….