ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 단어 변환 c++
    Coding Test/programmers 2021. 9. 14. 14:21
    728x90

    깊이/너비 우선 탐색(DFS/BFS) 문제

     

    문제 설명

    두 개의 단어 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 retrun
    "hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
    "hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0

     

    문제 풀이

     

    1. dfs 문제는 방문 처리가 중요! 

    2. words 와  target의 각 자리의 문자를 비교한다.

    3. 1개만 틀렸을 경우 변환할 수 있는 조건 성립

    4. 방문 처리를 하고 재쉬함수를 통해 다음 index번째의 단어를 검사한다.

    5. 재귀에서 나오면 해당 index의 방문처리를 false로 변경하여 

       다른 경우의 수도 검사할 수 있도록 한다.

     

    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    static int answer = 50;
    
    void dfs(string begin, const string target, const vector<string>& words,
    	vector<bool>& check, int cnt = 0) {
    
    	if (begin == target) {
    		if (answer > cnt) {
    			answer = cnt;
    			return;
    		}
    	}
    
    	for (int i = 0; i < words.size(); i++) {
    
    		if (check[i])
    			continue;
    
    		int b_cnt = 0;
    		for (int j = 0; j < words[i].length(); j++) {
    			if (begin[j] != words[i][j])
    				b_cnt++;
    		}
    
    		if (b_cnt == 1) {
    			check[i] = true;
    			dfs(words[i], target, words, check, cnt + 1);
    			check[i] = false;
    		}
    
    	}
    
    }
    
    int soltuion(string begin, string target, vector<string> words) {
    
    	vector<bool> check(words.size(), false);
    	dfs(begin, target, words, check);
    	return answer == 50 ? 0 : answer;
    }
    
    
    int main() {
    
    	vector<string> words = { "hot", "dot", "dog", "lot", "log", "cog" };
    	string begin("hit");
    	string target("cog");
    
    	int nRes = solution(begin, target, words);
    	cout << nRes << endl;
    
    	return 0;
    }
    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.