1. 주어진 str를 거꾸로 나열하는 함수를 작성하시오.
ex) 'awesome' => 'emosewa'
나의 풀이
function reverse(str){ if(str.length === 1) return str; return str[str.length-1] + reverse(str.slice(0,-1)); }
모범 풀이
function reverse(str){ if(str.length <= 1) return str; return reverse(str.slice(1)) + str[0]; }
2. 문자열을 거꾸로 해도 초기 문자열과 같으면 true, 아니라면 false를 반환하는 함수를 작성하시오.
ex) 'abcba' => true
나의 풀이
function isPalindrome(str){ function helper(str) { if(str.length === 1) return str; return str[str.length-1] + helper(str.slice(0,-1)); } if(str === helper(str)) return true; return false; }
모범 풀이
function isPlindrom(str) { if(str.length === 1) return true; if(str.length === 2) return str[0] === str[1]; if(str[0] === str.slice(-1)) return isPlindrom(str.slice(1,-1)) return false; }
3. 배열과 콜백함수를 인자로 받으며, 요소 중 하나라도 콜백함수를 만족하면 true가 도출되는 함수를 작성하시오.
나의 풀이
function someRecursive(arr, fnc){ for(let i = 0; i < arr.length; i++) { if(fnc(arr[i])) return true; } return false; }
모범 풀이
function someRecursive(arr, callback) { if(arr.lenth === 0) return false; if(callback(arr[0]) return true; return someRecursive(arr.slice(1), callback); }
4. 배열 안의 배열은 해체하여 기본 배열의 형태를 반환하는 함수를 작성하시오.
ex) flatten([1, 2, 3, [4, 5] ]) // [1, 2, 3, 4, 5]
flatten([1, [2, [3, 4], [[5]]]]) // [1, 2, 3, 4, 5]
모범 풀이
function flatten(oldArr){ var newArr = [] for(var i = 0; i < oldArr.length; i++){ if(Array.isArray(oldArr[i])){ newArr = newArr.concat(flatten(oldArr[i])) } else { newArr.push(oldArr[i]) } } return newArr; }
5. 배열 안의 모든 문자열의 첫번째 문자를 대문자, 나머지를 소문자로 바꾸어 반환하는 함수를 작성하시오.
ex) 'banana' => 'Banana'
나의 풀이
function capitalizeWords (arr) { let result = []; if(arr.length === 0) return []; else result.push(arr[0][0].toUpperCase() + arr[0].slice(1), ...capitalizeFirst(arr.slice(1))) 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; }
6. 주어진 객체 안에 숨겨진 짝수 값을 모두 더한 결과를 반환하는 함수를 작성하시오.
나의 풀이
function nestedEvenSum (obj, sum=0) { for(let key in obj) { if(typeof(obj[key]) === 'object') sum += nestedEvenSum(obj[key]); else if(obj[key]) === 'number' && obj[key] % 2 === 0) sum += obj[key]; } return sum; }
7. 문자열이 담긴 배열이 주어졌을 때, 모든 문자열의 문자를 대문자로 바꾸는 함수를 작성하시오.
ex) ['array', 'john'] => ['ARRAY', 'JOHN']
나의 풀이
function capitalizeWords(arr) { let result = []; if(arr.length === 0) return []; result.push(arr[0].toUpperCase(), ...capitalizeWords(arr.slice(1))); return result; }
다른 풀이
function capitalizeWords(arr) { if(arr.length === 1) return [arr[0].toUpperCase()]; let res = capitalizeWords(arr.slice(0,-1)); res.push(arr[arr.length-1].toUpperCase()); return res; }
8. 객체가 인자로 주어질 때, 배열의 모든 '숫자'값을 '문자열'로 바꾸는 함수를 작성하시오.
나의 코드 (실패)
function stringifyNumbers(obj) { for(let key in obj) { if(typeof obj[key] === 'object') stringifyNumbers(obj[key]); else if(typeof obj[key] === 'number') obj[key] = (obj[key]).toString(); } return obj; }
객체는 참조형 자료이기 때문에 자체를 바꾸지 말고 새로 만들 것
모범 풀이
function stringifyNumbers(obj) { const newObj = {}; for(let key in obj) { if(typeof obj[key] === 'number') newObj[key] = (obj[key]).toString(); else if(typeof obj[key] === 'object' && !Array.isArray(obj[key])) newObj[key] = stringifyNumbers(obj[key]); else newObj[key] = obj[key]; } return newObj; }
9. 객체가 인자로 주어질 때, 객체의 모든 문자열 값을 담은 배열을 반환하는 함수를 작성하시오.
function collectStrings(obj) {
let result = [];
for(let key in obj) {
if(typeof obj[key] === 'object') result.push(...collectStrings(obj[key]));
else if(typeof obj[key] === 'string') result.push(obj[key]);
}
return result;
}
모든 문제의 출처
Udemy [javascript 알고리즘 & 자료구조]
'Computer Science > Algorithm' 카테고리의 다른 글
[알고리즘] BFS(넓이 우선 탐색) & DFS(깊이 우선 탐색) - javascript (0) | 2023.01.18 |
---|---|
[알고리즘] 정렬(버블, 삽입, 선택, 합병, 퀵, 기수) - javascript (0) | 2023.01.17 |
[알고리즘] javascript 문제해결 패턴 - Sliding Window (기준점 간 이동) (0) | 2022.07.27 |
[알고리즘] javascript 문제해결 패턴 - Multiple Pointers (다중 포인터) (0) | 2022.07.26 |
[알고리즘] javascript 문제해결 패턴 - frequency counter(빈도 카운터) (0) | 2022.07.26 |