Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 str2에 나타나는 str1의 문자 개수 계산하기

문제 이해하기

두 개의 문자열 str1str2를 각각 첫 번째, 두 번째 인수로 전달받는 JavaScript 함수를 작성해야 합니다.

이 함수는 str1의 문자 중 str2에도 등장하는 문자의 개수를 세어 반환해야 합니다. 이때 같은 문자가 여러 번 등장한다면, 등장한 횟수만큼 각각 따로 세어야 합니다.

예를 들어 함수에 다음과 같은 값을 입력했다고 가정해 보겠습니다.

입력

const str1 = 'Kk';
const str2 = 'klKKkKsl';

출력

const output = 5;

'K'와 'k'는 대소문자가 서로 다른 문자로 취급되지만, 둘 다 str2에 포함되어 있으므로 str2 내에서 등장하는 총 횟수인 5가 결과가 됩니다.

풀이 접근 방법

이 문제는 해시 객체(맵)를 활용하면 간단하고 효율적으로 해결할 수 있습니다. 먼저 str1의 모든 문자를 객체의 키로 저장해 조회용 집합을 만든 뒤, str2를 순회하면서 각 문자가 이 객체에 존재하는지 확인하고 카운트를 증가시키면 됩니다.

이 방식의 시간 복잡도는 O(n + m)입니다(n은 str1의 길이, m은 str2의 길이). 두 문자열을 각각 한 번씩만 순회하면 되기 때문에 매우 효율적입니다.

구현 코드

다음은 위 로직을 구현한 전체 코드입니다.

const str1 = 'Kk';
const str2 = 'klKKkKsl';
var countAppearances = (str1 = '', str2 = '') => {
    const map = {}
    for(let c of str1) {
       map[c] = true
    }
    let count = 0
    for(let c of str2) {
       if(map[c]) {
          count+=1
       }
    }
    return count
};
console.log(countAppearances(str1, str2));

실행 결과

5

코드 동작 원리

코드의 실행 흐름을 단계별로 살펴보면 다음과 같습니다.

  1. 조회용 맵 생성: 빈 객체 map을 만들고, str1을 순회하며 각 문자('K', 'k')를 키로 저장합니다.
  2. 카운팅: str2를 순회하면서 현재 문자가 map에 존재하는지 확인하고, 존재하면 count를 1씩 증가시킵니다.
  3. 결과 반환: 순회가 끝나면 누적된 count 값을 반환합니다.

예시에서 str2인 'klKKkKsl'에는 'k'가 2번, 'K'가 3번 등장하므로 최종 결과는 5가 됩니다. 이처럼 해시 맵을 사용하면 중첩 반복문 없이 선형 시간 안에 문제를 해결할 수 있습니다.