[54일차] 재귀연습문제 - collectStrings

저요·2022년 11월 15일

2022 100th day challenge

목록 보기
54/97

문제

collectStrings

오브젝트를 받고 오브젝트안의 모든 스트링을 리스트로 반환하는 collectStrings를 작성하시오.

솔루션

이번도 이전에 풀었던 문제들과 같은 방식으로 해결했다.

function collectStrings(param){
    let tmpArr = [];
    for(let key in param){
        if(typeof(param[key]) === 'object'){
            tmpArr = tmpArr.concat(collectStrings(param[key]));
        }else if(typeof(param[key]) === 'string'){
            tmpArr.push(param[key]);
        }
    }    
    return tmpArr;
}

코드 작동원리

  1. 임시로 tmpArr생성
  2. for루프를 통해 object에 접근
  3. 값이 string일 경우 tmpArr에 push
  4. 내부에 object가 더 있을 경우 재귀함수 호출
    4-1. 재귀 내부에서 다시 for루프를 통해 내부 값에 접근
    4-2. string일 경우 arr에 push해서 return > concat으로 전체 Arr에 이어줌.
    4-3. 내부에 Object가 존재할 경우 재귀 다시 실행
  5. for루프가 종료되면 tmpArr 리턴

for루프를 사용해서 key를 이용해 접근한다면 nestedObject의 일차적 key에만 접근할 수 있기 때문에 불가피하게 for루프 내부에서 재귀함수를 호출해야한다.
O(n^2)의 시간복잡도가 걸리지 않는가 하지만 루프를 내부에서 계속해서 돌리는 것보다 훨씬 코드가 깔끔하고 효율적일것이라는 생각이 들었다.
나중에 시간이 되면 해당 코드를 더 효율적으로 구성할 수 있는 방법에 대해 연구해 보려고 한다. 아마 이 강의를 다 듣고 다른 알고리즘 방법도 터득한 뒤가 될거 같지만 그 때가 되면 다시 이 코드를 들여다 볼 예정이다.

concat을 사용하는것 보다는 +=를 사용하는 것이 더 효율적이라는것을 알고 있을것이다. 하지만 이번 코드에서 concat을 사용한 이유는 배열상태로 이어주고 싶었기 때문에다. +=를 사용하니 데이터끼리 접촉되었기 때문에 원하는 결과는 아니었다. 그래서 concat을 사용해서 tmpArr에 이어주었다.

해답솔루션

해답 솔루션에서도 나와 완전히 똑같은 방식으로 문제를 해결했기 때문에 추가로 소개하지는 않겠다.

출처

udemy.com/course/best-javascript-data-structures/learn/quiz/5338837#questions

profile
웹개발

0개의 댓글