프론트 개발자를 위한 여정

모든 영역을 안내하는 개발자

Algorithm/코테준비

[JS] 문자열 내 각 문자 개수 세기 / Map 사용, Object 사용, reduce 활용 방법 비교

ji-frontdev 2025. 3. 15. 15:50
728x90
반응형

📌 문제

주어진 문자열에서 각 문자의 등장 횟수를 계산하여 객체(Map)로 반환하는 함수를 구현하시오.

function charCount(str) {
  // 여기에 코드 작성
}

console.log(charCount("hello world"));
/*
출력 예시:
{ h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }
*/

 

🔹 코드

function charCount(str) {
   const map = new Map();
   const word = str.split('');
   
   for(let i = 0; i < word.length; i++) {
       if (word[i] === ' ') continue;  // 공백 무시

       if (map.has(word[i])) {
           map.set(word[i], map.get(word[i]) + 1);
       } else {
           map.set(word[i], 1);
       }
   }

   console.log(map);
}

console.log(charCount("hello world"));
/*
출력 예시:
{ h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }
*/

 


🔎 풀이 과정

1️⃣ 문제 접근 방식

  • 문자열을 순회하면서 각 문자의 등장 횟수를 세면 됨
  • 공백은 무시해야 하므로 if (word[i] === ' ') continue; 처리
  • 객체(Map)를 사용하여 문자 개수를 저장
  • 중복된 문자가 나오면 기존 값에서 +1 증가

🚀 다른 해결 방법과 성능 분석

 

방법 코드 시간 복잡도 공간 복잡도 장점 단점
1. Map 사용 (현재 코드) ✅ map.set() O(n) O(n) Key 존재 여부 체크가 빠름 Object보다 직관적이지만, 일반적인 사용법 아님
2. Object 사용 {} 객체 이용 O(n) O(n) 일반적인 JS 코드 스타일 hasOwnProperty 체크 필요할 수 있음
3. reduce() 활용 str.split('').reduce() O(n) O(n) 함수형 스타일 다소 난해할 수 있음

📌 1️⃣ Map 사용 (현재 코드) → O(n)

function charCount(str) {
   const map = new Map();
   const word = str.split('');
   
   for (let i = 0; i < word.length; i++) {
       if (word[i] === ' ') continue;

       map.set(word[i], (map.get(word[i]) || 0) + 1);
   }

   return Object.fromEntries(map);  // { } 객체로 변환
}

console.log(charCount("hello world"));
// { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }

성능 분석

  • 시간 복잡도: O(n) → 한 번 순회하며 문자 개수 카운트
  • 공간 복잡도: O(n) → 문자 개수를 저장하는 Map 사용
  • 장점: Map을 사용하면 키-값 조회 속도가 빠름
  • 단점: Object보다 일반적이지 않아 추가 변환이 필요함

📌 2️⃣ Object 사용 (일반적인 방식) → O(n)

function charCount(str) {
   const charMap = {};
   
   for (const char of str) {
       if (char === ' ') continue;
       charMap[char] = (charMap[char] || 0) + 1;
   }

   return charMap;
}

console.log(charCount("hello world"));
// { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }

성능 분석

  • 시간 복잡도: O(n) → 한 번의 순회
  • 공간 복잡도: O(n) → 추가 객체(charMap) 사용
  • 장점: 일반적으로 JS에서 사용되는 방식
  • 단점: hasOwnProperty() 체크 필요할 수도 있음

📌 3️⃣ reduce() 활용 (함수형 접근) → O(n)

function charCount(str) {
    return str.split('').reduce((acc, char) => {
        if (char !== ' ') {
            acc[char] = (acc[char] || 0) + 1;
        }
        return acc;
    }, {});
}

console.log(charCount("hello world"));
// { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }

성능 분석

  • 시간 복잡도: O(n) → 한 번의 순회
  • 공간 복잡도: O(n) → reduce() 내부 객체 사용
  • 장점: 함수형 스타일로 깔끔한 코드
  • 단점: 가독성이 떨어질 수 있음

🏆 결론: 어떤 방법을 선택해야 할까?

방법 추천 상황
Map 사용 (new Map()) Map이 필요한 경우 (빠른 키-값 조회가 중요할 때)
Object 사용 ({} 객체) 가장 일반적이며 직관적인 방식
reduce() 활용 함수형 스타일을 선호할 때

일반적으로 Object를 사용하는 것이 가장 적절한 선택! 🚀

728x90
반응형