문제
아래 예제를 보고 lastX 함수를 작성해라.
lastX('Winterfell', 3) // returns "ell"
내가 작성해서 해결한 코드
const lastX = (str, num, i = 0, box = "") => {
if (num <= 0 || str.length <= i) {
return box
}
box = box + str[str.length - num]
return lastX(str, num - 1, i + 1, box)
}
const b = lastX('Winterfell', 3)
console.log(b);
풀이 사고)
문자열 길이에서 입력한 번호를 빼면 출력범위의 시작 인덱스가 나온다.
재귀함수를 이용하여 num의 초깃값을 하나씩 빼며 box에 값을 저장한다.
문자열 길이를 초과하여 출력이 되지 않도록 인덱스 카운트를 추가한다.
num이 0보다 작거나 같아질 때, 또는 str의 길이가 i와 같거나 작아질 때, box를 리턴한다.
문제점)
lastX('Winterfell', 99)
// undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined
문자열 수를 초과하는 숫자가 인수로 들어갈경우
10 - 99,
10 - 98,
10 - 97 과 같은 연산으로
문자열의 수만큼 undefined를 반환하는 코드가 작성된다.
즉, 설계가 잘못되었다.
수정한 답안)
const lastX = (str, num, box = "", i = str.length - 1) => {
if ((box.length >= num) || i < 0) {
return box
}
return lastX(str, num, str[i] + box, i - 1)
}
const b = lastX('Winterfell', 6)
console.log(b);
설계를 바꿨다.
box도 재귀를 거쳐 length가 하나씩 증가한다는 것을 감안하여
box가 리턴되는 조건을 box.length가 num과 같아지는 것으로 한다.
또한 인덱스가 -1 이하가 될 경우, 의미가 없으므로 i가 0보다 작아질 경우 box를 반환한다.
box를 연장하는 재귀함수의 경우,
box = str[i] + box 의 구조를 띄게하여
재귀를 거칠때마다 새로운 요소가 box의 앞에 들어올 수 있도록 설계한다.
'Javascript' 카테고리의 다른 글
소수 생성기 (0) | 2022.08.04 |
---|---|
소수(Prime number) 구하기 및 jest를 이용한 테스트 케이스 작성 (0) | 2022.08.04 |
(자바스크립트) 문자열 (0) | 2022.08.02 |
고찰 (조건식에 boolean 값을 넣었을 때) (0) | 2022.08.02 |
(자바스크립트) 클로저, 함수 연계 연습 (0) | 2022.08.01 |