코딩/Javascript

Sliding Window

junhub 2023. 3. 17. 19:57
function solution(str1, str2) {
    let i = 0;
    let j = 0;
  
    while (j < str2.length) {
  
      if (str2[j] === str1[i]) {
        i += 1;
      }
    //이때 i = 3
      if (i === str1.length) { 
        return true;
      }
    
      j++;
  
        // j = 0 [a] , i = 0[6]
        // j = 1 [b] , i = 0[6]
        // j = 2 [6] , i = 0[6]
        // j = 3 [C] , i = 1[C]
        // j = 4 [D] , i = 2[D]
        // j = 5 [E] , i = 3[]
        // j = 6 [4] , i = 3[]
        // j = 7 [4] , i = 3[]
        // j = 8 [3] , i = 3[]
        // j = 9 [f] , i = 3[] 
    }
  
    return false;
    // window sliding
  }
  
  
  console.log(solution("hello", "wohelfkkorld"));
  console.log(solution("6CD", "ab6CDE443fgh22iJKlmn1o"));

sliding window는  창문이 옮겨간다는 알고리즘 풀이 방식이다. 범위(창문)가 자동으로 옮겨가면서 조건에 해당하는 답을 반환하게 된다. 이 방법은 시간복잡도가 O(n)이며, 자주 활용되는 방식이다. 

 

str1이 str2에 있는지를 확인해야 한다. 변수 i 와 변수 j 에 0을 할당한 후 while 반복문을 사용해 비교하려는 대상 즉, str2만큼 반복하게 한다. 이때 반복문 내에 j가 계속 증가할 수 있도록 j++ 을 써준다. 

조건문을 사용해 str2[j] === str1[i]가 같다면 i가 1만큼 증가하게 한다. 이말은 str2의 j 번째 인덱스는 계속 증가하면서 str1의 i 번째 인덱스는 같은 값을 반복해서 비교하다가 둘이 같은 값이 나오면 str1 의 i + 1 번째 인덱스를 비교하게 되고 또 같다면 str i +1 +1 번째 인덱스를 비교하게 된다. 이렇게 되면 코드의 주석 내용과 같이 비교해서 같은 값이 나온만큼 i 의 숫자가 증가하게 되는데 이 숫자는 결국 str1 의 length 와 같으므로 둘을 비교해서 같은 값이라면 true를 리턴하게 하면 된다.