알고리즘/PS - 프로그래머스
[프로그래머스 - C++] 단어 변환
excited-hyun
2021. 7. 10. 16:40
반응형
https://programmers.co.kr/learn/courses/30/lessons/43163
코딩테스트 연습 - 단어 변환
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수
programmers.co.kr
풀이
이 문제는 재귀함수를 이용해 구현한 DFS를 사용하여 풀이하였다.
이때 한개의 알파벳만 바꿔서 변환이 가능한지 확인하는 change()함수를 만들어서 계속 사용한다.
slove()함수를 재귀로 호출하며 DFS를 구현한다.
solve()함수 내에서는
- 현재 string이 target string과 동일한지 확인해 동일한 경우 min_change와 현재 재귀의 변경 횟수를 비교해 갱신하고 return
- 동일하지 않은 경우 재귀를 이어간다.
- words 벡터의 원소들에 대해서 아직 check[]가 0이고 change()값이 1인 경우(아직 변환하지 않았으며 변환 가능한 경우)에 대해서만 변환했음을 나타내는 check[]를 1로 set해주고 재귀 호출을 한다.
- 재귀를 마치고 돌아오면 다시 check[] 를 0으로 unset해준다.
#include <string>
#include <vector>
using namespace std;
int check[50];
int min_change = 10000;
//변환 가능한지 확인
int change(string from, string to) {
int cnt=0;
for(int i=0; i<from.length(); i++){
if(from[i]!=to[i])
cnt++;
}
//불가능
if(cnt != 1)
return -1;
return 1;
}
//DFS
void solve(int cnt, string now, string target, vector<string> words) {
//target과 같아짐
if(now == target){
if(cnt < min_change)
min_change = cnt;
return;
}
for(int i=0; i<words.size(); i++){
//이미 변환 or 변환 불가
if(check[i] != 0 || change(now, words[i]) != 1)
continue;
check[i] = 1;
solve(cnt+1, words[i], target, words); //다음!
check[i] = 0;
}
}
int solution(string begin, string target, vector<string> words) {
int answer = 0;
solve(0, begin, target, words);
//변환이 아예 불가능
if(min_change == 10000)
answer = 0;
else
answer = min_change;
return answer;
}
728x90
반응형