첫 번째 제출은 1시간 만에 끝났는데, test2의 테스트 1개가 통과를 안해서 그 것을 해결하는데 추가를 2시간이 걸렸다.
계속 걱정했던 자료구조는 자신있는 인접행렬이 나와서 쉽게 풀었다. dfs와 bfs가 나오지 않아서 HA는 잘 풀었지만, 꼭 시간을 내서 정리해야겠다.
재귀에서 오래걸린 부분은 전에도 비슷한 문제로 고민을 많이 했었는데, 복습을 충분히 했다고 생각했어도, 부족했는지 이번 HA에서도 내 발목을 잡을 뻔 했다.
비슷한 문제를 만들어서 설명해 보자면
문제: 임의 배열을 입력받아 조건에 맞는 숫자가 있는지 여부를 리턴하라 라는 문제가 있을때
const arr = [1, 2, 3, [4, 5], 6];
let output = findNum(arr, 4);
console.log(output) // true;
output = findNum(arr, 6);
console.log(output) // true;
output = findNum(arr, 10);
console.log(output) // false;
이렇게 결과를 반환하는 문제가 있다고 예시를 들어보면
처음에 작성했던 코드는
function findNum(arr, num) {
for (let el of arr) {
if (el === num) {
return true;
} else if (Array.isArray(el)) {
return findNum(el, num)
}
}
return false;
}
이런 식으로 작성했다.
내가 쓴 코드를 보면서 문제를 분석해본 결과
let arr = [1, 2, 3, [4, 5], 6];
let num = 6;
findNum(arr, num) //이렇게 함수를 실행 시켰을때
return findNum(el, num)
에서 재귀가 되면서
let arr = [4, 5]; // 재귀가 되면서 이렇게 실행이 된다.
let num = 6;
function findNum(arr, num) {
for (let el of arr) {
if (el === num) {
return true;
} else if (Array.isArray(el)) {
return findNum(el, num)
}
}
return false;
}
배열 [4, 5]에서 6이 있는지 찾아보게 된다.
그리고 없으면 바로 마지막 false 가 리턴이 되면서 전체 결과값이 false가 출력되던 것이다.
수정한 코드는 아래와 같다.
function findNum(arr, num) {
for (let el of arr) {
if (el === num) {
return true;
} else if (Array.isArray(el)) {
const result = findNum(el, num)
if (result === true) return true;
}
}
return false;
}
재귀 함수가 true일때만 return이 되기로 함으로써 재귀 배열이 끝날때 까지 num가 있는지 찾아보고 없을때만 false가 출력되도록 수정했다.