65일차 - 2번째 HA 1일차 마무리

김민찬·2021년 7월 13일
0

취업으로의 여정

목록 보기
66/196

2번째 HA 1일차를 제출했다.

첫 번째 제출은 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;
}

이런 식으로 작성했다.

그랬더니 입출력 예시에서 num이 4일때와 10일때는 true와 false로 제대로 값이 출력되는데, 문제는 num가 6일때도 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가 출력되도록 수정했다.

profile
두려움 없이

0개의 댓글