https://programmers.co.kr/learn/courses/30/lessons/43163
코딩테스트 연습 - 단어 변환
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수
programmers.co.kr
코드 설명
cnt 변수를 이용하여 한 글자가 다른 걸 찾는다 -> 재귀
재귀를 돌면서 target과 일치한다면 그때까지의 level을 tmp 변수에 담아둬서 가장 빠른 과정으로 도착할 경우를 찾는다.
(이때 min을 쓸거면 초기 result값을 큰 값으로 지정해둬야 한다!!! 여기서 실수해서 디버깅함...)
또한 result가 변화없이 다시 main으로 돌아왔다면 target을 한 번도 만나지 않았다는 의미 이므로 0을 반환해준다.
코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool visited[51];
int tmp;
int result=999;
int cnt;
void dfs(int level, string& begin, string& target, vector<string>& words) {
if (begin == target) {
tmp = level;
result = min(tmp, result);
return;
}
for (int i = 0; i < words.size(); i++) {
if (!visited[i]) {
cnt = 0;
for (int j = 0; j < words[i].size(); j++) {
if (words[i][j] != begin[j]) {
cnt++;
}
}
if (cnt == 1) {
visited[i] = true;
cout << words[i] << " ";
dfs(level + 1, words[i], target, words);
visited[i] = false;
}
}
}
}
int solution(string begin, string target, vector<string> words) {
int answer = 0;
dfs(0, begin, target, words);
if (result == 0) answer = 0;
else {
answer = result;
}
return answer;
}
int main() {
solution("hit", "cog", { "hot", "dot", "dog", "lot", "log", "cog" });
return 0;
}
'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 이중우선순위큐(Lv3/C++) (0) | 2021.08.23 |
---|---|
[프로그래머스] 네트워크 (C++) (0) | 2021.05.29 |
[프로그래머스] 더 맵게 (0) | 2021.05.01 |
[프로그래머스] 프린터 (0) | 2021.04.30 |
[프로그래머스] 기능개발 (0) | 2021.04.30 |