코딩테스트 문제풀이/inflearn

[인프런] Node.js / 섹션3 - 문자열 탐색 / 4. 가장 짧은 문자거리

sangchu 2023. 1. 14. 20:17

문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력

 

나의 풀이

function solution(s, t) {
  let answer = "";
  let tArr = [];
  let tIdx = s.indexOf(t);
  let distance;
  let nowDistance;
  s = s.split("");

  while (tIdx != -1) {
    tArr.push(tIdx);
    tIdx = s.indexOf(t, tIdx + 1);
  }

  for (let i = 0; i < s.length; i++) {
    distance = Number.MAX_SAFE_INTEGER;
    for (let j = 0; j < tArr.length; j++) {
      nowDistance = Math.abs(s.indexOf(s[i], i) - tArr[j]);
      if (nowDistance < distance) distance = nowDistance;
    }
    answer += distance;
  }
  return answer;
}

let str = "teachermode";
console.log(solution(str, "e"));

 

일단 문자열에 있는 t의 인덱스 값을 다 구해서 tArr 배열에 할당했다.

그래서 문자열을 돌며 현재 tArr의 값을 다 비교하며 가장 짧은 거리를 구했다.

이는 거리(distance)와 현재거리(nowDistance) 변수를 지정해서 풀었다.

 

강사 풀이

function solution2(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(solution2(str, "e"));

문자열의 오른쪽 방향으로 다 돌며 e와의 거리를 택한다

e를 아직 한번도 안만난 경우에는 1001, 1002 ... 이렇게 지정하도록 한다.

이들은 answer 배열에 push해둔다.

 

다 돌면 다시 문자열을 왼쪽 방향으로 다 돌며 e와의 거리를 구한다. 

현재 값과 answer에 있는 값과 비교해서 더 작은값으로 재할당한다.