티스토리 뷰

728x90

문제 설명

두 개의 단어 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 합니다.

 

입출력 예

begin target words return
"hit" "cog" [hot, dot, dog, lot, log, cog] 4
"hit" "cog" [hot, dot, dog, lot, log] 0

 

 

코드

#include <string>
#include <vector>
#include <climits>

using namespace std;

int dfs(int depth, string begin, string target, vector<string> &words, vector<bool> &used)
{
    int i, j, cnt;
    int res = INT_MAX;
    
    // 모든 단어를 사용해도 target이 될 수 없는 경우
    if (depth == words.size())
    {
        return INT_MAX;
    }
    // target이 된 경우
    if (begin.compare(target) == 0)
    {
        return depth;
    }
    // 사용하지 않은 단어들에 대하여
    for (i = 0; i < words.size(); i++)
    {
        if (used[i])
        {
            continue;
        }
        cnt = 0;
        for (j = 0; j < begin.size(); j++)
        {
            if (begin[j] != words[i][j])
                cnt++;
            if (cnt > 1)
                break;
        }
        // 한 글자만 다른 단어인 경우, begin을 이 단어로 변경하여 다음 dfs 진행
        if (cnt == 1)
        {
            used[i] = true;
            res = min(res, dfs(depth + 1, words[i], target, words, used));
            used[i] = false;
        }
    }
    // 최소 단계를 리턴
    return res;
}

int solution(string begin, string target, vector<string> words) {
    int answer;
    vector<bool> used;
    
    used.resize(words.size(), false);
    answer = dfs(0, begin, target, words, used);
    if (answer == INT_MAX)
        return 0;
    return answer;
}

 

링크

programmers.co.kr/learn/courses/30/lessons/43163

 

코딩테스트 연습 - 단어 변환

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

programmers.co.kr

github.com/inbdni/Programmers/blob/master/level03/%EB%8B%A8%EC%96%B4%EB%B3%80%ED%99%98.cpp

 

inbdni/Programmers

Contribute to inbdni/Programmers development by creating an account on GitHub.

github.com

 

728x90
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
공지사항
링크
Total
Today
Yesterday