
문제 해결 방법을 정의한 '일련의 단계적 절차'이자 어떠한 문제를 해결하기 위한 '동작들의 모임'이다
출처 : wiki
즉, 문제 해결 위해 수행해야 하는 일련의 과정 및 단계
EX)
문자열을 받아 각각의 문자의 갯수를 출력하는 charCount 함수를 작성하시오
(단, 대소문자 구분 없음)
charCount('aaaA'); // {a:4}
charCount('Hi~ Hello World! 1223');
/*
{
h: 2,
i: 1,
e: 1,
l: 3,
o: 2,
w: 1,
r: 1,
d: 1,
1: 1,
2: 2,
3: 1
}
*/
const charCount = (str) => { // 기본적 구성 요소
// 실행 과정
// 리턴 : 객체, 각각의 키는 소문자, 값은 숫자, 특수문자 공백 제외
}
function charCount (str) { // 세분화
[시작] => 객체 생성
[과정] =>
string 문자열 순회하며 각각의 문자 처리
문자가 숫자/문자 && 객체 안에 없을 경우 => object의 key로 설정 후 +1
문자가 숫자/문자 && 객체 안에 있을 경우 => 해당 숫자/문자의 key로 값을 찾아 +1
문자나 숫자가 아닌 공백,마침표 등등 일 경우 카운팅 하지 않는다
[끝] => 객체를 반환한다
};
function charCount(str) {
// 시작 => 객체 생성
const result = {};
// 과정 => string 문자열 순회하며 각각의 문자 처리
for (let i = 0; i < str.length; i++) {
// 영대문자 -> 영소문자
const char = str[i].toLowerCase();
// 문자나 숫자가 아닌 공백,마침표 등등 일 경우 카운팅 하지 않고 다음 문자열 체크
if (/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/ ]/gim.test(char)) continue;
if (result[char] > 0) { // 문자가 숫자/문자 && 객체 안에 없을 경우 => object의 key로 설정 후 +1
result[char]++;
} else { //문자가 숫자/문자 && 객체 안에 있을 경우 => 해당 숫자/문자의 key로 값을 찾아 +1
result[char] = 1;
}
}
// 끝 => 객체를 반환한다
return result;
}
console.log(charCount('aaaaa~~~~bbb**(@@ccccccccccc!!!!&&& dddddd')); //{ a: 5, b: 3, c: 11, d: 6 }
💡 예제 풀이에서 선택했던 정규표현식은 일반적으로 백트래킹으로 일치 여부 판단 , 최악의 경우 O(2^n)의 복잡도를 가짐 (n=정규식 크기) -> 어디까지나 최악의 경우, 까다로운 조건이 아니라면 큰 문제는 없으나 성능 향상을 위해 아래와 같이 시간복잡도 O(1)방식으로 변경 가능
function isCharNumeric(char) {
const code = char.charCodeAt(0);
if (
!(code > 47 && code < 58) && // numeric (0 to 9)
!(code > 64 && code < 91) && // upper (A to Z)
!(code > 96 && code < 123) // lower (a to z)
) {
return false;
}
return true;
}
function charCount(str) {
// 시작 => 객체 생성
const result = {};
// 과정 => string 문자열 순회하며 각각의 문자 처리
for (const char of str.toLowerCase()) {
// 문자나 숫자가 아닌 공백,마침표 등등 일 경우 카운팅 하지 않고 다음 문자열 체크
if (!isCharNumeric(char)) continue;
// 문자가 숫자/문자 && 객체 안에 없을 경우 => object의 key로 설정 후 +1
//문자가 숫자/문자 && 객체 안에 있을 경우 => 해당 숫자/문자의 key로 값을 찾아 +1
result[char] = ++result[char] || 1;
}
// 끝 => 객체를 반환한다
return result;
}
console.log(charCount('aaaaa~~~~bbb**(@@ccccccccccc!!!!&&& dddddd')); //{ a: 5, b: 3, c: 11, d: 6 }
🥲그전에는 무작정 아무것도 고려하지 않고 결과만 나오는 것에만 집중해 코드부터 냅다 썼는데... 확실히 위의 방법대로 따라가니 머릿속에 더 정리되고 구현 시간이 조금 줄어든 느낌이다.