본문 바로가기

알고리즘/알고리즘 문제 풀이

[프로그래머스] 단어 변환 c++

반응형

[프로그래머스] 단어 변환 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;
}
반응형