Programmers 43163

단어 변환

Posted by Damin on March 2, 2020

단어 변환

문제 링크

  • 두 개의 단어 begin(ex. hit) target(ex. cog)와 단어의 집합 words가 있다 (ex. hot,dot,dog,lot,log,cog)

  • begin 단어 부터 시작

  • 한 번에 한 개의 알파벳만 바꿀 수 있다.

  • words에 있는 단어로만 바꿀 수 있다(임의로 못 바꾼다)

  • 최소한으로 target으로 가는 과정을 만들어 보자 (여러가지 경로가 있을 수 있다)

  • 모든 단어의 길이는 같습니다.

  • 변환할 수 없는 경우에는 0을 return


  1. 자신이 갈 수 있는 경로 (단어가 1개 밖에 차이 안나는 경우) 에 대해서 모든 경우를 탐색 해 준다.

  2. 만약 자신이 방문하지 않았고, 갈 수 있는 경로라면 dfs!

  3. target과 현재 자신이 같다면 return!

주의할 점

visited는 dfs 과정마다 다르게 사용되어야 하기 때문에

전역변수로 두지 않고, 파라미터로 끼워 넣어 줬다.

Code

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
29
30
31
32
33
34
35
36
37
38
39
40
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int answer = 1e9;

bool isit(string now, string next) { // 1개 밖에 차이 안나는 지?
	int ans = 0;
	for (int i = 0; i < now.size(); i++) {
		if (now[i] != next[i]) ans++;
	}
	return (ans == 1) ? true : false;
}

void go(vector<string> words, int index, int ans, string target,vector<bool>visited) {
	visited[index] = true;
	string now = words[index];
	if (now == target) { // target이라면 최소한의 과정의 수로 만들어 주자
		answer = min(answer, ans);
		return;
	}
	for (int i = 0; i < words.size(); i++) {
		if (!visited[i] && isit(now, words[i])) // 방문하지 않았고, 갈 수 있다면
			go(words, i, ans + 1, target, visited);
	}
	return;
}

int solution(string begin, string target, vector<string> words) {
	for (int i = 0; i < words.size(); i++) {
		if (isit(begin, words[i])) {
			vector<bool>visited;
			visited.resize(51);
			go(words, i, 1, target, visited);
		}
	}
	return (answer == 1e9) ? 0 : answer;
}