프론트엔드 개발자의 기록 공간

모든 아나그램 찾기 본문

알고리즘_JS/인프런 JS알고리즘

모든 아나그램 찾기

[리우] 2022. 3. 25. 01:54

🚩  모든 아나그램 찾기

 

📖 문제 설명 : S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요. 아나그램 판별시 대소문자가 구분됩니다.

 

💡 해쉬, 투포인터, 슬라이딩 윈도우의 기법이 사용된다.

 

function solution(S, T) {
  let answer = 0

  let map1 = new Map()
  let map2 = new Map()

  // 초기 슬라이딩 윈도우 크기 세팅
  // 비교 대상 고정된 T의 문자열 길이 만큼 Map set
  for (let i = 0; i < T.length; i++) {
    if (map1.has(S[i])) {
      map1.set(S[i], map1.get(S[i]) + 1)
    } else {
      map1.set(S[i], 1)
    }
    if (map2.has(T[i])) {
      map2.set(T[i], map2.get(T[i]) + 1)
    } else {
      map2.set(T[i], 1)
    }
  }

  // 초기 윈도우 이후 오른쪽으로 이동하면서 아나그램 비교
  // 초기 비교에 비교를 수행하고
  // 문자를 삭제, 추가하므로 마지막 비교를 위해 S길이 + 1
  let lt = 0
  for (let rt = T.length; rt < S.length + 1; rt++) {
    let compare = true

    // 아나그램 비교
    for (let [key, val] of map2) {
      if (!map1.has(key) || val !== map1.get(key)) {
        compare = false
        break
      }
    }

    if (compare) answer += 1

    // 제일 왼쪽 문자 한 개 삭제
    map1.set(S[lt], map1.get(S[lt]) - 1)
    lt += 1

    // 제일 오른쪽 문자 추가
    if (map1.has(S[rt])) {
      map1.set(S[rt], map1.get(S[rt]) + 1)
    } else {
      map1.set(S[rt], 1)
    }
  }
  return answer
}

let S = 'bacaAacba'
let T = 'abc'
console.log(solution(S, T)) // 3

 

👨‍💻 코드 설

1. T의 길이만큼 T와 S 소요를 map 객체를 이용해 생성해 준다. (각각 S : map1,  T : map2라고 지칭)

 

2. 반복문을 통해 map1 객체의 key, value를 map2 객체와 비교를 통해 같은지 비교한다.

(전부 같으면 카운트)

 

3. 비교가 끝난 map1 객체에서  제일 앞 요소의 값을 제거해 주고 다음 인덱스의 S 소요의 값을 넣어 준다.

 

4. 2번, 3번을 반복

 

 

잘못된 설명, 코드, 예외 케이스가 있다면 댓글 남겨주시면 수정하겠습니다.

728x90

'알고리즘_JS > 인프런 JS알고리즘' 카테고리의 다른 글

[투포인트] 결혼식  (0) 2022.03.26
Least Recently Used(카카오 캐시 문제 변형)  (0) 2022.03.25
괄호 문자 제거(스택)  (0) 2022.03.25
연속 부분수열 2  (0) 2022.03.16
연속 부분수열 1  (0) 2022.03.15
Comments