알고리즘이란 무엇인가 ?
: 특정 작업을 수행하기 위한 프로세스 또는 일련의 단계를 의미한다.
면접에서 문제를 풀기 위한 단계
예시: 두 개의 숫자를 받아 합계를 반환하는 함수를 작성하라.
function charCount(str) {
// 마지막에 반환할 빈 객체를 만든다
const result = {};
// 문자열의 각 문자를 돌면서
for(let i=0; i<str.length; i++) {
const char = str[i];
// 만약 객체에 해당 문자가 이미 들어갔으면, 문자의 개수에 1을 더한다
if(result[char] > 0) {
result[char]++;
}
// 만약 객체에 해당 문자가 없다면, 객체에 더해주고 값을 0으로 지정한다
else {
result[char] = 1;
};
// 객체를 반환한다
return result;
}
function charCount(str) {
const result = {};
for (let i = 0; i < str.length; i++) {
// 모두 소문자로 통일한다
const char = str[i].toLowerCase();
// 영문자와 숫자인 경우만 처리하도록 조건 추가
if (/[a-z0-9]/.test(char)) {
if (result[char] > 0) {
result[char]++;
} else {
result[char] = 1;
}
}
}
return result;
}
console.log(charCount('helloㄴㅇㄹ123'));
위 예시를 아래와 같이 리팩토링 할 수 있다 ⬇️
function charCount(str) {
const result = {};
for (let char of str) {
// 모두 소문자로 통일한다
char = char.toLowerCase();
// 영문자와 숫자인 경우만 처리하도록 조건 추가
if (/[a-z0-9]/.test(char)) {
// 값이 이미 있는(truthy) 경우 좌측 실행, 없는 경우(falsey) 우측 실행
result[char] = ++result[char] || 1;
}
}
return result;
}
console.log(charCount('helloㄴㅇㄹ123'));
⬇️ charCodeAt을 사용하여 함수 분리하는 방법으로 또 리팩토링
: 정규표현식으로 인한 혹시모를 문제를 방지하고, 가독성이 좋다!
function charCount(str) {
const result = {};
for (let char of str) {
if (isAlphaNumeric(char)) {
char = char.toLowerCase();
result[char] = ++result[char] || 1;
}
}
return result;
}
function isAlphaNumeric(char) {
const code = char.charCodeAt(0);
if (
!(code > 47 && code < 58) && // numeric(0-9)
!(code > 64 && code < 91) && // upper alphabet(A-Z)
!(code > 96 && code < 123) // lower alphabet(a-z)
) {
return false;
}
return true;
}
console.log(charCount('helloㄴㅇㄹ123'));