굥뷰를 햡시댜
[Programmers] 단어 변환 본문
https://programmers.co.kr/learn/courses/30/lessons/43163
코딩테스트 연습 - 단어 변환 | 프로그래머스
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다. 2. words에 있는 단어로만 변환할 수 있습니다. 예를 들어 begin이 hit, target가 cog, words가 [hot,dot,dog,lot,log,cog]라면 hit -> hot -> dot -> dog ->
programmers.co.kr
이 문제는 그래프를 따로 만들 수 있는지 없는지가 중요하다.
- 풀이 방법
1. 그래프를 따로 만들고 BFS로 풀었다.
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int visit[52];
int solution(string begin, string target, vector<string> words) {
int answer = 0;
vector<string> new_words;
vector<vector<int>> vec(words.size() + 1);
//하나로 합쳐줌(그래프를 만들어준다)
new_words.push_back(begin);
for(int i=0; i<words.size(); i++) {
new_words.push_back(words[i]);
}
for(int i=0; i<new_words.size() - 1; i++) {
string temp = new_words[i];
for(int j=i+1; j<new_words.size(); j++) {
string temp1 = new_words[j];
int dif_cnt = 0;
for(int k=0; k<temp1.length(); k++) {
if(temp[k] != temp1[k]) {
dif_cnt += 1;
}
}
if(dif_cnt == 1) {
vec[i].push_back(j);
vec[j].push_back(i);
}
}
}
if(begin != target) {
queue<int> q;
q.push(0);
visit[0] = 1;
while(!q.empty()) {
int from = q.front();
string cur = new_words[from];
q.pop();
bool flag = false;
for(int i=0; i<vec[from].size(); i++) {
int to = vec[from][i];
if(visit[to] == 0) {
visit[to] = visit[from] + 1;
if(new_words[to] == target) {
flag = true;
answer = visit[to] - 1;
break;
}
q.push(to);
}
}
if(flag) break;
}
}
return answer;
}
'알고리즘 문제 풀이 > KaKao 문제 풀이' 카테고리의 다른 글
[Programmers] 전화번호 목록 (0) | 2019.10.11 |
---|---|
[Programmers] 타겟 넘버 (0) | 2019.10.11 |
[Programmers] 네트워크 (0) | 2019.10.11 |
[Programmers] 영어 끝말잇기 (0) | 2019.10.08 |
[Programmers] 올바른 괄호 (0) | 2019.10.08 |
Comments