[프로그래머스] 단어 변환 | JavaScript | 계산된 속성명

예구·2023년 11월 14일
0

Algorithm

목록 보기
46/47
post-thumbnail

문제 출처

1. 문제

문제 설명

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.

예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.

두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
  • begin과 target은 같지 않습니다.
  • 변환할 수 없는 경우에는 0를 return 합니다.

입출력 예

begintargetwordsreturn
"hit""cog"["hot", "dot", "dog", "lot", "log", "cog"]4
"hit""cog"["hot", "dot", "dog", "lot", "log"]0

입출력 예 설명

예제 #1

문제에 나온 예와 같습니다.

예제 #2

target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.



2. 내 풀이

처음에는 wordssort()를 해서 bfs를 사용할까 생각했지만 정렬을 한다고 해도 알파벳이 하나씩 다른지 여부를 체크해야 한다는 것을 알게 되었다.
따라서 isConnect()라는 함수를 따로 만들어서 두 단어의 같은 인덱스 값을 비교하여 다른 알파벳의 개수가 1개라면 true를, 아니라면 false를 리턴하도록 했다.

그 후 단어별로 거쳐간 과정의 개수를 세야 하는데 객체를 어떻게 사용할지 고민이 됐다. 사실 이번에 { [begin]: 0 } 형태를 처음 사용해 봤다. { begin: 0 }로 지정하면 key 값이 "begin"이 되기 때문에 key 값으로 begin에 저장된 값을 넣고 싶을 때는 [begin] 형태로 작성해야 한다.

정리하자면 다음과 같다.

  • { [begin]: 0 }
    • 계산된 속성명(Computed Property Name) 사용
    • begin 변수의 값을 이용하여 객체의 속성명을 동적으로 생성
  • { begin: 0 }
    • 단순히 객체의 속성명을 직접 지정

전체 코드는 다음과 같다.

// 두 단어가 한 개의 알파벳만 다른지 체크하는 함수
function isConnect(word1, word2) {
  const len = word1.length;
  let cnt = 0; // 다른 알파벳 개수

  for (let i = 0; i < len; i++) {
    if (word1[i] !== word2[i]) cnt++;
  }

  return cnt === 1 ? true : false;
}

function solution(begin, target, words) {
  // 단어별 거친 과정 개수 저장
  // begin 그대로 넣으면 begin이 key로 설정됨
  let visited = { [begin]: 0 };
  let queue = [begin];

  // bfs
  while (queue.length > 0) {
    let currentWord = queue.shift();

    if (currentWord === target) break; // 목적지 도착 여부 체크

    for (let word of words) {
      // 알파벳이 하나만 다르고, 아직 체크하지 않은 단어라면
      if (isConnect(currentWord, word) && !visited[word]) {
        queue.push(word);
        visited[word] = visited[currentWord] + 1; // 과정 수 증가시키기
      }
    }
  }

  return visited[target] ? visited[target] : 0;
}



3. 계산된 속성명(Computed Property name)

이번에 처음 사용한 만큼 계산된 속성명에 잠깐 정리해 보려고 한다.

3.1. 계산된 속성명이란?

  • JavaScript ES6부터 지원되는 속성
  • 객체 속성명을 동적으로 결정하는 것
  • [ ] 안에 식을 넣고 그 결과가 속성명으로 사용됨
  • 구조분행 할당과 세트로, React에서도 매우 유용하게 사용됨

3.2. 예시

// 계산된 속성명 미사용
function makeObj1(key, value) {
  const obj = {};
  obj[key] = value;
  return obj
}

// 계산된 속성명 이용
function makeObj2(key, value) {
  return {[key]: value}
}

-[key] 값이 key의 이름으로 동적으로 할당됨

profile
우당탕탕 FE 성장기

0개의 댓글