반응형
[프로그래머스] 단어 변환 C++
문제
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.
예를 들어 begin이 "hit", target가 "cog", words가 ["hot", "dot", "dog", "lot", "log", "cog"] 라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
제한사항
- 각 단어는 알파벳 소문자로만 이루어져 있습니다.
- 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
- words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
- begin과 target은 같지 않습니다.
- 변환할 수 없는 경우에는 0을 return 합니다.
입출력 예
begin | target | words | return |
---|---|---|---|
hit | cog | [hot, dot, dog, lot, log, cog] | 4 |
hit | cog | [hot, dot, dog, lot, log] | 0 |
입출력 예 설명
- 예시 #1 : 문제에 나온 예와 같습니다.
- 예시 #2 : target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.
풀이
- 다른 사람들 풀이 보니까 뭔가 DFS로 많이 풀었더라
- 아마도 그 사람들은 한 단어 선택해서 거기서부터 계속 깊이 있게 들어가는 개념으로 생각해서 푼 듯.
- 근데 나는 BFS로 풀 생각을 했음 => 단어마다 visit 체크해주면서 넣어주면 될 것 같다는 생각으로?
- while 문 안에서 즉, queue가 비어있지 않는 한 계속 도는 loop 문에서 '한 번에 한 개의 알파벳만 바꿀 수 있다' 라는 조건을 적용시키기 위해 기존에는 sameCnt 라는 변수로 같은 단어 두개가 있을 때마다 +1을 해주었는데 테스트3이랑 테스트4가 실패가 떴음
- 설마? 하고 똑같지 않은거로 바꿔버리니까 통과.. 반례를 한번 생각해봐야겠다.
코드
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(string begin, string target, vector<string> words) {
int answer = 0;
vector<bool> visit;
vector<int> value;
//변환 여부 판단
bool check = false;
for(int i = 0; i < words.size(); i++) {
if(target == words[i]) {
check = true;
break;
}
}
if(!check)
return 0;
queue<pair<string, int>> q;
visit.resize(words.size(), false);
q.push(make_pair(begin, 0));
while(!q.empty()) {
string curWord = q.front().first;
int num = q.front().second;
q.pop();
if(curWord == target)
return num;
for(int i = 0; i < words.size(); i++) {
if(visit[i])
continue;
int notSameCnt = 0;
for(int j = 0; j < curWord.length(); j++) {
if(curWord[j] != words[i][j])
notSameCnt++;
}
if(notSameCnt == 1) {
visit[i] = true;
q.push(make_pair(words[i], num+1));
}
}
}
return answer;
}
반응형
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[프로그래머스] 자물쇠와 열쇠 C++ (0) | 2020.07.23 |
---|---|
[프로그래머스] 괄호 변환 C++ (0) | 2020.07.20 |
[프로그래머스] 네트워크 C++ (0) | 2020.03.24 |
[프로그래머스] 위장 파이썬 (0) | 2020.03.17 |
[프로그래머스] 전화번호 목록 파이썬 (0) | 2020.03.16 |