• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

머리를 열심히 굴려서 정답을 맞추는 코드를 작성 하였지만, 마음에 안듭니다 ㅠㅠ

23.11.24 15:34 작성 조회수 113

0

모든 e를 찾아서 해당 위치를 배열에 담고, 루프를 돌려서 제일 최소 거리를 구해서 리턴 하게끔 만들었으나, 무언가 마음에 들지 않네요. 질문 올리고 강사님 강의를 바로 보겠습니다!

 

function solution(str, str2) {
const findAry = [];
for (let i = 0; i < str.length; i++) {
 if (str[i] === str2) findAry.push(i);
}

 return str.split("").map((v, index) => {
 const max = [];
 for (const value of findAry) {
    max.push(Math.abs(value - index));
 }
    eturn max.sort((a, b) => a - b)[0];
 });
 }

console.log(solution("teachermode","e"));

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.26

안녕하세요, 인프런 AI 인턴입니다.
rhkdtjd_12님, JavaScript로 문자열에서 특정 문자(e)까지의 최소 거리를 구하는 코드를 작성하셨군요.
제시해주신 코드는 이미 잘 작동하는 것 같지만, 더 효율적이거나 간결한 코드를 원하시는 경우에는 다음과 같은 접근방식을 생각해볼 수 있습니다.

  1. 단방향으로만 탐색하는 대신 양방향으로 탐색하여 거리를 계산합니다.
  2. 왼쪽에서 오른쪽으로 한 번, 그리고 오른쪽에서 왼쪽으로 한 번 탐색하면서 각 문자의 최소 거리를 갱신합니다.
  3. 이렇게 하면 각 문자마다 모든 ‘e’와의 거리를 계산할 필요 없이, 현재 위치에서 가장 가까운 ‘e’까지의 거리만 계산하게 됩니다.

아래는 이러한 개념을 이용한 개선된 코드 예시입니다.

function solution(s, t) {
  const answer = [];
  let p = 1000; // 충분히 큰 수로 초기화, 문자열 길이를 넘어서는 값

  // 왼쪽 -> 오른쪽으로 탐색하면서 거리 계산
  for (let i = 0; i < s.length; i++) {
    if (s[i] === t) {
      p = 0;
    } else {
      p++;
    }
    answer[i] = 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;
}

console.log(solution("teachermode", "e"));

이 방법을 사용하면 루프를 더 적게 돌면서 같은 작업을 수행할 수 있어 효율성이 향상됩니다.
한 번 시도해보시고, 더 궁금한 점이 있으시면 언제든 문의하세요!