[51일차] 재귀연습문제 - capitalizeWords

저요·2022년 11월 12일

2022 100th day challenge

목록 보기
51/97

문제

capitalizeWords

string의 배열을 받아서 대문자로 변환시킨뒤에 새로운 배열로 반환하는 capitalizeWords를 구현하라.

솔루션

내가 이 문제에 대해 작성한 솔루션은 다음과 같다.

    if(params.length === 1){
        params[0] = params[0].toUpperCase();
        return params;
    }

먼저 다음과 같이 파라미터로 받은 배열의 길이가 1인지를 확인한 후에 그것을 대문자화하고 해당 배열을 반환하는 코드를 적었다. 이것은 이 재귀함수의 종료점이 될 것이다.

    let capitalizeArr = capitalizeWords(params.slice(1));
    capitalizeArr.unshift(params[0].toUpperCase());
    return capitalizeArr;

그 다음 코드에 재귀를 넣었는데 배열의 속성이 하나만 남을 때까지 index 0을 제외한 나머지 배열을 잘라서 재귀함수를 호출했다. 따라서 종료점에서 return된 배열이 capitalizeArr에 세팅이 되고 현재 파라미터의 배열의 맨처음 요소를 대문자화한뒤 순서가 바뀌지 않도록 unshift를 이용해서 맨 앞 자리에 세팅한다. (하지만 이렇게 하면 배열의 인덱스를 모두 바꾸어야 해서 시간복잡도가 좋지 않다.) 그리고 나서 그 배열을 반환한다. 다시 capitalizeArr에 반환된 배열이 세팅되고 이 작업을 원래의 배열만큼 반복하게 된다.

	//[apple, banana, kiwi] 를 넣었을 경우

	[apple, banana, kiwi] // capitalizeArr = [];
	[banana, kiwi] // capitalizeArr = [];
	[kiwi] // capitalizeArr = [KIWI];
	[banana, kiwi] // capitalizeArr = [BANANA, KIWI];
	[apple, banana, kiwi] // capitalizeArr = [APPLE, BANANA, KIWI];

처음에 내가 저지른 실수가 있다. 좀 얼빠진 실수였지만 중요하다고 생각하기 때문에 여기에 기록해둔다.
나는 처음에 length가 1일때 배열이 아닌 문자열을 반환했었다. 때문에 후에 진행된 코드에서 push에서 오류가 생겼다. 왜 이런 오류가 생길까 분명히 나는 배열로 선언을 했었는데 하고 고민고민하다 겨우 찾아냈었다.

	return params[0] = params[0].toUpperCase();

이렇게 데이터를 봔환했던 것을.. 내 눈이 옹이구멍이라는 생각을 했었다. 눈앞에 오류를 두고 한참을 찾았으니 말이다. 이런식으로 반환하면 배열의 타입이 아닌 String의 타입으로 return이 된다.

해답솔루션

해답솔루션에서 접근법은 나와 크게 다를게 없었다. 하지만, 배열 return 방식과 배열에 속성을 넣는 방식은 unshift를 사용하지 않았기 때문에 소개하고 싶다.

    return [array[0].toUpperCase()];

내가 위에 저지른 실수에 대해 소개하지 않았나? 따로 params 배열을 추가할 필요없이 중괄호로 감싸는 것으로 배열의 모습을 반환할 수 있다는 것을 알아두면 좋을 것 같다.

unshift는 앞에 새로운 속성을 추가하는 것으로 뒤의 속성들의 인덱스를 모두 변경해야하기 때문에 효율성 부분에서는 많이 떨어진다. 해답 솔루션에서는 unshift를 사용하지 않고 push를 사용하면서도 기존 배열의 순서를 유지했다. 그 이유는 다음과 같이 작성했기 때문이다.

	let res = capitalizeWords(array.slice(0, -1));
	res.push(array.slice(array.length-1)[0].toUpperCase());

해답 솔루션에서는 파라미터로 들어온 해당 배열을 앞에서 부터 하나씩 차례로 자른게 아니라 뒤에서부터 잘라냈다 그렇기 때문에 push를 이용해도 배열의 순서가 바뀌지 않았던 것이다.

출처

https://www.udemy.com/share/105zfq3@YBdX_MD5wDLJCiQikXCgL4lZ6Z582bNTehXpN2C85tiqWzZuwQ54EAwBlwiiK_YDcw==/

profile
웹개발

0개의 댓글