[F-Lab 모각코 챌린지 - 13일차] - 알고리즘 일지

Big One·2023년 5월 23일
0

F-Lab

목록 보기
50/69

문제

1. 첫 문자 대문자(capitalizeFirst)

입력 배열의 각 요소들의 문자를 첫 글자만 대문자로 출력해라.
Write a recursive function called capitalizeFirst. Given an array of strings, capitalize the first letter of each string in the array.

조건: 재귀

capitalizeFirst(['car','taco','banana']); // ['Car','Taco','Banana']

나의 풀이

function capitalizeFirst (array) {
    let result = [];
    
    function inner(array) {
        let changeWord = array[0][0].toUpperCase() + array[0].slice(1);
        if(array.length === 1){
            return result.push(changeWord);
        }
        result.push(changeWord);
        return result.concat(inner(array.slice(1)));
        
    }
    inner(array);
    return result;
}

다른 풀이

function capitalizeFirst (array) {
  if (array.length === 1) {
    return [array[0][0].toUpperCase() + array[0].substr(1)];
  }
  const res = capitalizeFirst(array.slice(0, -1));
  const string = array.slice(array.length - 1)[0][0].toUpperCase() + array.slice(array.length-1)[0].substr(1);
  res.push(string);
  return res;
}

느낀점

음 .. 알아보기 쉽게 내부 함수를 선언해서 내부 함수를 재귀함수로 사용하였다.
결론적으로 풀이법은 같았지만 뒤에서부터 음 .. 맨 앞 하나만 남겨놓고 하나씩 추가하는 반면에 나는 전체배열에서 처음부터 순서대로 했다. 걍 역순으로 한건데 뒤에서부터 잘라내고 채워나가는게 익숙하지도않고 이해가 잘 안되고 디버깅도 안된다. 한참 뒤에 하나씩 직접 디버깅해보고 이해함 ....

2. 짝수인 수 만 더하기 (nestedEvenSum)

객체 안에 있는 값들 중 짝수 인 숫자만 모두 더하여 총 합계를 출력하라.
Write a recursive function called nestedEvenSum. Return the sum of all even numbers in an object which may contain nested objects.
조건: 재귀

var obj2 = {
  a: 2,
  b: {b: 2, bb: {b: 3, bb: {b: 2}}},
  c: {c: {c: 2}, cc: 'ball', ccc: 5},
  d: 1,
  e: {e: {e: 2}, ee: 'car'}
};

nestedEvenSum(obj1); // 6
nestedEvenSum(obj2); // 10

나의 풀이

1. 첫 번째 시도

function nestedEvenSum (obj) {
    let result = 0;
    for(let key in obj){
        if (typeof obj.key === 'number'){
            result += obj.key;
        }else if (typeof obj.ket === 'object') {
            return result + nestedEvenSum(obj.key);
        }
    }
    return result;
}
2. 두번째 시도

function nestedEvenSum (obj) {
    console.log('현재 obj : ', obj);
    let result = 0;
    let values = Object.values(obj);

    if(typeof values[0] === 'number'){
        if (values[0].length === 1 ) return values[0];
        console.log(values[0]);
        result += values[0];
        return result + nestedEvenSum(values.slice(1));
    }
    if(typeof values[0] === 'object'){
        if(values[0].length === 1 ) return 0;
        console.log(values[0]);
        return result + nestedEvenSum(values[0]);
    }
    return result;
}

다른 풀이

function nestedEvenSum (obj, sum=0) {
    for(let key in obj){
        if(typeof obj[key] === 'number' && obj[key]%2 === 0){
            sum += obj[key];
        }else if(typeof obj[key] === 'object'){
            sum += nestedEvenSum(obj[key]);
        }
    }
    return sum;
}

느낀점

일단 함수의 인자를 초기화해서 넣는다는건 아예 생각하지 못했다. 중요한건 아니지만 ..
가장 중요한건 객체에 대한 접근인데 for.. in.. 을 사용하면 객체를 순회할 수 있는건 알았지만 문자열로 출력이 되는지 몰랐다.
그리고 객체 프로퍼티 접근할 때 object[property], obj.prop 두개의 접근법 중 [] 가 문자열인건 알았지만 생각을 못했다.. 그냥 정확히 모르는걸로 결론내렸고 for.. in.. 문과 객체 접근에 대한것을 제대로 공부해야겠다.

추가로 나의 풀이에선 실패한 이유

첫 번째 풀이

문제풀이 접근에 대해 굉장히 잘했지만, 객체 접근법을 몰랐던 점과 그놈의 return이 뭐길래 재귀를 호출할때 return이 무조건 있어야한다는 생각이 잘못 잡혀있어서 .. 무조건 return 을 박아넣었다.... 생각 좀 하고 쓰자 ㅠㅠ

두번 째 풀이
객체 접근 법 obj['name'] 을 생각못해서 객체의 values를 변수에 배열로 할당하고 순차적으로 조회 후 number면 더한 후 하나 줄여서 재귀 호출 object면 재귀 호출 그랬더니 객체인 프로퍼티 다음에 있는 프로퍼티는 조회를 안하게 되는게 문제였다. 아마 .. 전체 반복순회 해주는 것이 없는게 문제였던것 같다.. 이럴거면 맨 마지막 리턴문에서 재귀를 호출했어야 했을 것 같다.

수정해서 작성해봄

내가 생각했던 나만의 풀이법에서 뭐가 부족했던건지 파악했고 코드를 한 번 고쳐보았다.

2번째 방법에서 사용했던 풀이에서 함수 리턴에 재귀 호출을 하는 방식으로 작성했더니 됨 ㅇㅋㅇㅋ 굿 ! 
아직도 내부함수 사용해서 작성하는거랑 그냥 함수 자체를 재귀로 호출해서 답 구하는거랑 헷갈린다 ㅠㅠ 더해지는게 헷갈림 .! 
자체를 하려면 걍 무조건 return 함수명; 하는데 함수명에 꼭 뭔가 사라지거나 해야하고 return 전에 무조건 확인을 하는것으로 한다.
function nestedEvenSum (obj) {
  if(typeof obj === 'object' && Object.keys(obj).length === 0 ) return 0;
    let result = 0;
    let values = Object.values(obj);
  console.log(values)
  
  if(typeof values[0] === 'number'){
    result += values[0];
  }else if(typeof values[0] === 'object'){
    result += nestedEvenSum(values[0]);
  }
    return result + nestedEvenSum(values.slice(1));
}
profile
이번생은 개발자

0개의 댓글