[js] 문자열이 몇 번 등장하는지 세기

sookyoung.k·2024년 6월 26일
1
post-thumbnail

문자열 myString과 pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 1 ≤ myString ≤ 1000
  • 1 ≤ pat ≤ 10

나의 풀이

function solution(myString, pat) {
    return [...myString].reduce((acc, cur, idx) => {
        let str = myString.slice(idx, pat.length+idx);
        if(str === pat) return acc + 1;
        return acc;
    }, 0)
}
  1. myString을 배열로 변환한 후 reduce() 메서드를 이용해서 패턴을 센다. 초기값은 0으로 준다.
    • 현재 인덱스에서 pat의 길이만큼 슬라이스하여 부분 문자열을 만든다.
    • 슬라이스한 부분 문자열이 패턴 pat과 일치하면 acc에 1을 더한다.
    • 패턴이 일치하지 않으면 acc를 그대로 반환한다.

다른 풀이 1

function solution(myString, pat) {
    const reg = new RegExp(`(?=${pat})`, "g")
    return myString.match(reg)?.length || 0;
}
  1. pat를 포함하는 정규 표현식 객체를 생성한다.
    • (?=${pat})는 긍정형 전방 탐색(lookahead)을 사용하여 문자열 내에서 pat이 시작되는 위치를 찾는다.
    • "g" 플래그는 전역 검색을 의미한다.
  2. myString이 reg에 맞는 부분 문자열을 검색하여 배열로 반환한다.
    • ?. - 옵셔널 체이닝 연산자, match 결과가 null일 경우 undefined를 반환한다.
    • 결과 배열의 길이를 반환하거나 0을 반환한다.

다른 풀이 2

function solution(myString, pat) {
    let count = 0;
    for (let i = 0; i <= myString.length - pat.length; i++) {
        if (myString.slice(i, i + pat.length) === pat) {
            count++;
        }
    }

    return count;
}

내 풀이를 reduce 대신 for로 슨 거나 마찬가지임.
1. 패턴이 등장하는 횟수를 저장할 count를 0으로 초기화한다.
2. i를 0부터 myString.length - pat.length까지 순회한다.
3. 현재 위치 i에서 pat.length만큼 부분 문자열을 슬라이스하여 pat과 비교한다.
4. 일치하면 count를 1씩 증가시켜 최종 count를 반환한다.

다른 풀이 3

const solution=(s,p)=>Array(s.length-p.length+1).fill('').map((v,i)=>s.slice(i,i+p.length)).filter(v=>v==p).length;
  1. s의 길이에서 p의 길이를 뺀 값에 1을 더한 크기의 배열을 생성하고 모든 요소를 빈 문자열로 채운다. ➡️ Array(s.length - p.length + 1).fill('')
  2. map() 메서드로 배열을 돌며 각 요소에 대해 s의 부분 문자열을 슬라이스하여 새로운 문자열을 만든다. i에서 시작해 i+p.length까지의 부분 문자열을 슬라이스 한다.
  3. filte() 메서드로 슬라이스 된 부분 문자열 배열에서 p와 일치하는 부분 문자열만 필터링한다.
  4. length 반환한다.
profile
영차영차 😎

0개의 댓글