입력 배열의 각 요소들의 문자를 첫 글자만 대문자로 출력해라.
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;
}
음 .. 알아보기 쉽게 내부 함수를 선언해서 내부 함수를 재귀함수로 사용하였다.
결론적으로 풀이법은 같았지만 뒤에서부터 음 .. 맨 앞 하나만 남겨놓고 하나씩 추가하는 반면에 나는 전체배열에서 처음부터 순서대로 했다. 걍 역순으로 한건데 뒤에서부터 잘라내고 채워나가는게 익숙하지도않고 이해가 잘 안되고 디버깅도 안된다. 한참 뒤에 하나씩 직접 디버깅해보고 이해함 ....
객체 안에 있는 값들 중 짝수 인 숫자만 모두 더하여 총 합계를 출력하라.
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));
}