출처 : https://school.programmers.co.kr/learn/courses/30/lessons/43163
풀이 방법
변환이 가능한지 확인할 수 있는 함수가 필요하다 이를 위해 두 단어의 스펠링 개수 차이가 1이면 가능하다고 판단하는 canChange함수를 작성했다.
그 후 일반적인 bfs함수를 통해 tartget 단어가 될 때까지 수행했다.
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
bool canChange(string str1, string str2) { // 글자 변경 가능 확인
int n = str1.length();
int diff = 0;
for (int i = 0;i < n;i++) {
if (str1.at(i) != str2.at(i)) {
diff++;
}
}
if (diff == 1) { // 변경 가능
return true;
}
else { //변경 불가능
return false;
}
}
int bfs(string begin, string target, vector<string> words) {
queue<pair<string, int>> q;
q.push(make_pair(begin, 0)); // 다음 단더, 횟수 저장
vector<int> visited(words.size(), 0); // 방문 배열 초기화
while(!q.empty()) {
string next = q.front().first;
int cnt = q.front().second;
q.pop();
for (int i = 0;i < words.size();i++) {
if (visited[i] == 0 && canChange(next, words[i])) { // 변경 가능하다면
if (words[i] == target) {
return cnt+1;
}
visited[i] = 1;
q.push(make_pair(words[i], cnt+1));
}
}
}
return 0; // 정답이 없는 경우
}
int solution(string begin, string target, vector<string> words) {
int answer = 0;
answer = bfs(begin, target, words);
return answer;
}
'Algorithm' 카테고리의 다른 글
[백준] 1학년 5557번 (c++) dp (0) | 2024.09.19 |
---|---|
[백준] 줄세우기 2631번 (c++) LSB (0) | 2024.09.16 |
[프로그래머스] 전력망을 둘로 나누기 (C++) bfs (0) | 2024.09.14 |
[백준] 회장뽑기 2660번 (C++) bfs (0) | 2024.09.13 |
[백준] 톱니바퀴 14891번 (python) 구현 (1) | 2024.09.08 |