[44일차] 재귀연습문제2

저요·2022년 11월 5일

2022 100th day challenge

목록 보기
44/97

서론

오늘도 이어서 재귀문제를 풀어보도록 할 것이다. 이번에 재귀 문제들은 저번에 소개한 문제들 보다 조금 더 난이도가 있는 문제들이다.

문제&솔루션

문제1 reverse

주어진 문자열을 반대로 반환하는 재귀함수 reverse를 구현하시오.

function reverse(str){
  if(str.length === 0){
      return '';
  }
  return str[str.length - 1].concat(reverse(str.split('').slice(0, str.length - 1).join('')))
}

나는 순수재귀를 이용해서 reverse를 작성했다. 함수안에 데이터를 수집할 변수를 먼저 선언한 뒤 재귀함수를 또 다시 정의하는 방법으로 변수를 보호하지 않고 호출 문자열에 파라미터로 받은 모든 문자열을 return한 뒤 concat메서드를 사용해서 이어붙이고 반환했다.

reverse 정답 솔루션

reverse(str.slice(1)) + str[0];

정답 솔루션을 보고 조금 충격을 받았다. 정석대로 끝에서부터 자르고 문자열을 생성해서 반환할 생각이었던 나와 전혀 다르게 접근했기 때문이다. 정답 솔루션에서는 내가 문자열을 배열로 바꾸고 자르고 그걸 다시 join하는 과정을 간단하게 생략했다. 1에서부터 문자열을 자르고 맨 처음 인덱스에 있던 문자를 끝에 붙이는 것으로 아주 간단하게... 이런 방법을 생각 못하다니 내가 너무 배운것을 활용하는 것에만 급급했던것 같다.

문제2 isPalindrome

파라미터로 받은 문자열이 앞으로 읽어도 뒤로 읽어도 같다면 true를, 같지 않다면 false를 반환하시오.

function isPalindrome(str){
  // add whatever parameters you deem necessary - good luck!
  let tempStr = '';
  
  function isPalindromeRecursion(data){
      if(data.length === 0){
          return '';
      }else{
          tempStr += data[data.length-1];
          isPalindromeRecursion(data.split('').slice(0,data.length-1).join(''));
      }
  }
  
  isPalindromeRecursion(str);
  
  return (str === tempStr) ? true : false;
}

이 문제에서는 솔루션을 작성할 때 함수 안에 재귀함수를 다시 호출하는 helper패턴을 이용해서 작성했다.
또, 데이터를 이어붙이는 것에 이전과 같이 concat메서드가 아닌 '+'연산자를 사용하였다.

tempStr.concat(data[data.length-1]);

이렇게 하지 않은 이유는 사실 concat은 문자열을 추가할 때마다 인스턴스를 생성해서 반환하는데 이때문에 성능과 속도면에서 좋지않기 때문에 concat보다는 '+'연산자를 사용하는 것을 권장하고 있다. 또 다른 이유로는 concat을 이용하면 원본 문자열을 변경시키지 않기 때문에 tempStr에는 변화없이 값이 리턴이 되는것이다. 때문에 이 솔루션에선 concat이 아닌 '+'연산자를 사용해서 작성했다.

isPalindrome 정답 솔루션

if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1))

isPalindrome의 정답 솔루션에서는 앞과 뒤를 동시에 비교했다. 그리고 비교한 것들을 잘라낸 배열을 반환하면서 다시 함수를 호출했다.

리뷰

다음에는 좀 더 생각해서 다양한 방법을 떠올려 보아야 겠다는 생각을 갖게 되었다...

출처

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/concat#:~:text=concat()%20%ED%95%A8%EC%88%98%EB%8A%94%20%ED%98%B8%EC%B6%9C,%EC%A0%84%EC%97%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.
https://www.udemy.com/share/105zfq3@z_uOtwfu3cgEeWkrPWya3Lg19mWu6rk0po70Hm8fzIJJNun9wBS9JwoK2qnpHY0ZaA==/

profile
웹개발

0개의 댓글