5_hyun 2022. 8. 16. 03:03
반응형

 

내 해결법

나는 indexOf를 이용해서 t의 위치를 다 구해줬다. 그리고 이중 반복문을 사용해서 거리를 구했다. 비효율적이라고 생각한다.

 

내 코드

<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(s, t) {
        let answer = Array.from(
          { length: s.length },
          () => Number.MAX_SAFE_INTEGER
        );

        let indexT = [];

        let i = 0;
        while (i < s.length) {
          let tmp = s.indexOf(t, i);
          indexT.push(tmp);

          i = tmp + 1;
        }

        for (let x of indexT) {
          for (let i = 0; i < s.length; i++) {
            if (i === x) answer[i] = 0;
            else {
              answer[i] = Math.min(answer[i], Math.abs(x - i));
            }
          }
        }

        return answer;
      }

      let str = "teachermode";
      console.log(solution(str, "e"));
    </script>
  </body>
</html>

 

강사님 풀이

큰 값을 하나두고 t값이 나오기 전까지 +1을 하다가 t값이 나오면 그 큰 값을 0으로 만든다. 그리고 이것을 오름차순, 내림차순으로 for문을 2번 사용하면 자연스럽게 가까운 값이 구해진다. 이때 2번째 for문에서는 둘 중에서 작은 값을 선택하면 된다.

 

강사님 코드

<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;
          else p++;

          answer.push(p);
        }

        p = 1000;
        for (let i = s.length - 1; i > -1; i--) {
          if (s[i] === t) p = 0;
          else answer[i] = Math.min(answer[i], p);

          p++;
        }
        return answer;
      }

      let str = "teachermode";
      console.log(solution(str, "e"));
    </script>
  </body>
</html>

이렇게 p를 문자 최대 길이보다 크게 두고 문제를 해결하면 된다.

반응형