📌강의 정리
가짜 난쟁이 두개를 제외시키고 출력하자
9개의 숫자중 2개의 숫자를 빼서 가짜인지 확인해보는 과정을 반복한다.
이중 for문이 돌아야한다.
i와 j가 가짜인지 확인하자
9명의 총합을 sum이라고 구해놓고 arr[i]와 arr[j]값을 더한후
그값을 sum에서 빼면 그 값이 가짜난쟁이이다.
splice를 쓰자.
얕은 복사를 해서 arr값을 복사해두자.
얕은복사는 answer = arr인데 arr값이 바뀌면 answer값도 바뀐다.
let sum=arr.reduce((a,b)=>a+b,0); 를 써서 sum을 우선 다 더한값으로 넣는다.
이중 포문에서 처음에는 i=0 그 다음에는 j=i+1로 한다.
i뒷편부터 구해야 하기 때문이다. 적절히 콘솔을 넣어서 부분적으로 계속 디버깅하자 console.log(arr[i], arr[j]) 이중포문 다음에 if문을 써서 100으로 맞춰보면 된다.
주의할점은 splice하는 순간 배열의 구성이 달라진다.
그러므로 뒤에 것을 제거하고 그 다음 앞의것을 제거한다. j → i 순서
📌느낀점
처음으로 시간내에 풀지 못한 알고리즘 문제였다.
좀 더 쉽게 풀 수 있는 아이디어가 있었는데 바로 총값을 먼저 구해놓고
다른 난쟁이둘을 더해서 빼는 것이었다.
나는 이중반복문까지는 맞췄지만 매순간 둘을 빼고 다 더하는 것으로 했고
거기서 살짝의 오류가 있었던것같다.
또한 저렇게 하기위해서 반복문 사이사이 배열의 원본을 백업하고 다시 돌아가는 방법을 택했는데
우선 이 부분에서 얕은복사를해서 나의 추측과 다르게 진행되었다.
또한 조금만 더 생각해보면 어차피 모든 배열을 다 돌아야 하며 그럴때는 i=0,i++ → j=i+1,j++ 로 반복문을 돌리면 다 돌아가는 것이다. 이번에 크게 느낀건 알고리즘을 짤때 무턱대고 실행하지말고 최대한 간단하게 할 수 있게 계속 생각을 해야한다는 점이다.
알고나면 왜 그랬나 싶다..
다시 푸니 splice를 잘써야겠다는 생각이 든다.
splice는 매개변수가 2개를 받고 처음값은 주소 두번째값은 0이면 추가 1이면 1개빼기 2이면 두개 빼기이며 세번째값부터는 추가하는 값이다.
2번 인덱스에서 한 개 요소 제거하고 "trumpet" 추가이면
var removed = myFish.splice(2, 1, 'trumpet');이고
var removed = myFish.splice(2); 이다
1개만 썼을때를 주의하자!
//나의 코드
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr){
let answer=[];
let list1=arr;
let list2=arr;
for(let i=0; i<arr.length; i++){
list2 = arr;
list2.splice(i);
for(let j=0;j<list2.length;j++){
list1=list2;
list1.splice(j);
if((list1.reduce(function(a,b){
return a+b;
},0) === 100)){
answer = list1;
}
}
}
return answer;
}
let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));
</script>
</body>
</html>
//강사님 코드
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(arr){
let answer=[];
let list1=arr;
let list2=arr;
for(let i=0; i<arr.length; i++){
list2 = arr;
list2.splice(i);
for(let j=0;j<list2.length;j++){
list1=list2;
list1.splice(j);
if((list1.reduce(function(a,b){
return a+b;
},0) === 100)){
answer = list1;
}
}
}
return answer;
}
let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));
</script>
</body>
</html>
'JS 알고리즘 문제풀이 > 섹션 1. 기본문제 풀이' 카테고리의 다른 글
10.문자 찾기 (0) | 2022.01.11 |
---|---|
9.A를 #으로 (0) | 2022.01.11 |
7.10부제 (0) | 2022.01.11 |
6.홀수 (0) | 2022.01.11 |
[보충] 내장함수로 최솟값, 최댓값 구하기 (0) | 2022.01.11 |