반응형
문제 : https://programmers.co.kr/learn/courses/30/lessons/43163
서론
분류는 DFS/BFS
DFS를 이용한 완전탐색으로 구현
풀이
우선 예제2외 같은 예외를 처리해야한다.
words에 target과 같은 문자열이 없으면 0을 리턴한다.
wrods에 target과 같은 문자열이 있으면 begin을 target이 될 때까지 DFS를 실행하는 완전탐색으로 최초 문자열이 변할 수 있는 모든 경우의 수를 탐색한다.
현재 문자열(최초에는 begin)을 words의 문자열들과 비교해서 변환 가능하면 DFS를 계속 이어간다.
아래는 현재 문자열이 선택한 words의 문자열로 변환 가능한지 확인하는 문자열 비교함수
두 문자열의 같은 문자(순서도 같은) 개수가 문자열의 길이-1이면 변환가능하므로 true를 리턴
bool stringCompare(string a, string b) {
int sum = 0;
int len = a.length();
for (int i = 0; i < len; i++) {
if (a[i] == b[i]) sum++;
}
if (sum == len - 1) return true;
else return false;
}
DFS
void dfs(int idx, string cur, string target, vector<string> &words) {
if (cur.compare(target) == 0) { // 현재 문자열이 target과 같으면 answer와 dfs의 탐색깊이(몇단계만에 왔는지)를 비교
answer = min(answer, idx);
return;
}
for (int i = 0; i < wordsSize; i++) { // words의 문자열 중 변경하능한 문자열을 찾아서 탐색을 이어간다
if (visited[i] == 0 && stringCompare(words[i], cur) == true) { // 문자열 비교함수가 true면 변경가능
//cout<<cur<<endl;
visited[i] = 1;
dfs(idx + 1, words[i], target, words);
visited[i] = 0;
}
}
return;
}
구현
// c++
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int visited[50];
int answer = 0x7f7f7f7f;
bool stringCompare(string a, string b) {
int sum = 0;
int len = a.length();
for (int i = 0; i < len; i++) {
if (a[i] == b[i]) sum++;
}
if (sum == len - 1) return true;
else return false;
}
void dfs(int idx, string cur, string target, vector<string> &words) {
if (cur.compare(target) == 0) {
answer = min(answer, idx);
return;
}
int vSize = words.size();
int len = words[0].length();
for (int i = 0; i < vSize; i++) {
if (visited[i] == 0 && stringCompare(words[i], cur) == true) {
//cout<<cur<<endl;
visited[i] = 1;
dfs(idx + 1, words[i], target, words);
visited[i] = 0;
}
}
return;
}
int solution(string begin, string target, vector<string> words) {
bool findTarget = false;
for (int i = 0, size = words.size(); i < size; i++) {
if (target.compare(words[i]) == 0) findTarget = true;
}
if (findTarget == false) return 0;
dfs(0, begin, target, words);
return answer;
}
최근댓글