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
반응형
'Algorithm > 코테준비' 카테고리의 다른 글
[JS] 피보나치 수 반환 / 재귀함수, 반복문, 시간복잡도,공간복잡도 비교 (0) | 2025.03.16 |
---|---|
[JS] 버블 정렬 (Bubble Sort) / 버블 정렬, 최적화 버블 정렬, 내장 sort() (0) | 2025.03.15 |
[JS] 배열에서 최솟값과 최댓값 찾기 / 정렬sort, Math.min()&max(), 반복문 방법 비교 (0) | 2025.03.15 |
[JS] FizzBuzz 문제 / 조건문, 문자열누적, Map활용 (0) | 2025.03.15 |
[JS] 문자열 뒤집기 / array-reverse, for문, 재귀함수 (0) | 2025.03.15 |