# 생각
다른 문자가 있는지 체크를 해주고
다른 문자가 1개일 때만 탐색을 해준다
dfs/bfs로 풀어볼 수 있다
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
int vis[55], answer = 55;
// dfs를 이용한 풀이
void dfs(string& begin, string& target, vector<string>& words, int depth)
{ // base condition
if (begin == target)
{
answer = min(answer, depth);
return;
}
for (int i = 0; i < words.size(); i++)
{
int cnt = 0;
for (int j = 0; j < words[i].size(); j++)
{
if (begin[j] != words[i][j]) cnt++;
if (cnt > 1) break;
}
if (cnt == 1 and vis[i] == false)
{ // 한 개의 문자만 다르면서 방문 하지 않은 단어라면 탐색
vis[i] = true;
dfs(words[i], target, words, depth + 1);
vis[i] = false;
}
}
}
// bfs를 이용한 풀이
void bfs(string& begin, string& target, vector<string>& words)
{
queue<pair<string, int>> q; // 단어, 횟수
q.push({ begin, 0 }); // 시작 지점
while (!q.empty())
{
auto cur = q.front(); q.pop();
for (int i = 0; i < words.size(); i++)
{
string st = cur.first;
answer = cur.second;
int cnt = 0;
if (vis[i]) continue; // 이미 방문했다면 패스
for (int j = 0; j < words[i].size(); j++)
{
if (st[j] != words[i][j]) cnt++; // 다른 문자가 있을 때
if (cnt > 1) break;
}
if (cnt == 1) // 다른 문자가 하나일때
{
if (words[i] == target)
{
answer++;
return;
}
vis[i] = true;
q.push({ words[i], answer + 1 });
}
}
}
answer = 0; // 여기까지 도달했으면 target에 도달하지 못한 것
}
int solution(string begin, string target, vector<string> words)
{
//dfs(begin, target, words, 0);
//if (answer == 55) return 0;
bfs(begin, target, words);
return answer;
}
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'Algorithm > 프로그래머스' 카테고리의 다른 글
[Lv.1] 모의고사 with cpp (0) | 2022.03.05 |
---|---|
[Lv.3] 여행경로 with cpp (0) | 2022.03.05 |
[Lv.3] 네트워크 with cpp (0) | 2022.03.03 |
[Lv.2] 타겟 넘버 with cpp (0) | 2022.03.02 |
[Lv.3] 베스트앨범 with cpp (0) | 2022.03.01 |