JS 알고리즘 문제풀이/섹션 3. 문자열 탐색

4.가장 짧은 문자거리

crab. 2022. 1. 13. 11:35

📌강의 정리

문제만 읽고 이해가 안될때는 입력과 출력을 보고 다시 문제를 이해해보자.

매 문자마다 e가 어디있는지 판단하면서 코드를 작성할수는 있지만 그건 힘든일이다.

포문을 정방향으로 한번돌고 역방향으로 돌면 해결할 수 있다.

시간 복잡도는 O(N)이다.

2N처럼 계수는 생략한다.

p라는 변수를 1000으로 하고 e를 만나지않으면 ++해준다.

e를 만나면 p를 0으로 초기화해준다.

그럼 answer = 1001, 0, 1,2,3,0,1,2,3,4,0이 된다.

이 의미는 자기 왼쪽에 e와 떨어진 거리를 의미한다.

따라서 처음의 p가 1001처럼 큰값을 받은것이다.

그럼 이제 포문을 역방향으로 가면 또 같은방법으로 하면 된다.

p가 계속 ++되며 바뀌는 그 방법이다.

이때 answer를 바꿔주는데 최소값을 구해야하므로 둘을 비교하여 작은 값을 넣어두고 있는다.

for문을 돌리면서 x of s에서 x와 t가 같으면 p=0이되고 answer에 p=0을 푸시하면 된다.

반대로 같지 않다면 p++하며 p를 푸시하면 된다.

이후 인덱스번호를 이용한 for문을 써서 역방향으로 i - -로 돌면서 같으면 p=0하고 그냥 지나가고 그다음 다를경우 p++하고 answer값과 이값을 비교하여 answer[i] = Math.min(answer[i], p)를 하여 작은값을 넣어준다.

📌느낀점

내가 푼 방법과 강사님이 푼방법이 다르다.

나는 내 방법이 좋은지 알았는데 시간복잡도 측면에서 강사님의 코드가 더 좋다..

한발자국이 모자른것 같다.

중요한것은 다음에 비슷한 문제를 풀때는 좀 더 효율적인 방법을 써야한다는 것이다.

//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(s, t){
                let answer=[];
                let a = s.split('e');
                console.log(a);
                a.pop();
                console.log(a);
                for(let i=0; i<a.length; i++){
                    for(let j=0; j<a[i].length; j++){
                        if(j<a[i].length/2) answer.push(j+1);
                        else if(j>=a[i].length/2){
                            answer.push(a[i].length-j);
                        }
                    }
                    answer.push(0);
                }
                console.log(a);                
                return answer;
            }
            
            let str="teachermodeqwrtye";
            console.log(solution(str, 'e'));
        </script>
    </body>
</html>
//220605 추가 나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(s, t) {
        let answer = [];
        let min = Number.MAX_SAFE_INTEGER;
        let cnt = 0;
        let test = -7;
        console.log(Math.abs(test));
        for (let i = 0; i < s.length; i++) {
          for (let j = 0; j < s.length; j++) {
            if (s[j] === t) {
              cnt = Math.abs(j - i);
              if (cnt < min) min = cnt;
            }
          }
          answer.push(min);
          min = Number.MAX_SAFE_INTEGER;
        }
        return answer;
      }

      let str = "teachermode";
      console.log(solution(str, "e"));
    </script>
  </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(s, t){
                let answer=[];
                let p=1000;
                for(let x of s){
                    if(x===t){
                        p=0;
                        answer.push(p);
                    }
                    else{
                        p++;
                        answer.push(p);
                    }
                }
                p=1000;
                for(let i=s.length-1; i>=0; i--){
                    if(s[i]===t) p=0;
                    else{
                        p++;
                        answer[i]=Math.min(answer[i], p);
                    }
                }
                return answer;
            }
            
            let str="teachermode";
            console.log(solution(str, 'e'));
        </script>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 3. 문자열 탐색' 카테고리의 다른 글

5.문자열 압축  (0) 2022.01.13
3.숫자만 추출  (0) 2022.01.13
2.유효한 팰린드롬  (0) 2022.01.13
1.회문 문자열  (0) 2022.01.13