알고리즘 문제
프로그래머스 - 단어 변환 (C++)
als982001
2023. 3. 3. 11:04
https://school.programmers.co.kr/learn/courses/30/lessons/43163
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이번 문제는 주어진 단어의 알파벳 하나만을 변경하면서 주어진 target을 만들 수 있는지, 만들 수 있다면 최소 몇 번 알파벳을 바꿔야 하는지를 구하는 문제이다. 이번 문제는 BFS를 이용하여 풀 수 있는 문제이다. BFS 문제는 미로 탈출 등과 같이 2차원 배열을 이용하여 푸는 경우가 많았는데, 이 문제는 그렇지 않고 주어진 단어만 검사하면 되기 때문에 다른 BFS 문제에 비하면 쉬운 편이라 생각했다. 이 문제를 풀기 위해 구상한 절차는 다음과 같다.
- 큐를 생성한 후, 시작 단어를 push 한다. 그리고 반복문을 이용해 탐색을 시작한다.
- 만약 현재 큐의 front에 있는 단어가 target과 같다면, 현재까지 탐색한 횟수(시간)을 return한다.
- 주어진 words를 모두 검사한다.
- 만약, i번째 단어가 이미 탐색한 단어라면 continue를 이용해 해당 단어를 건너뛴다.
- 현재 단어에서 i번째 단어로 바꿀 수 있는지 검사한다. 검사는 각 단어의 알파벳을 하나 하나 비교하여, 만약 다른 알파벳의 개수가 1개 이하라면 바꿀 수 있고 그렇지 않다면 바꿀 수 없다고 판단한다.
- 만약 바꿀 수 있다면 그 단어를 체크했음을 기록한 후, 큐에 그 단어를 push한다. 그리고 2번으로 돌아간다.
#include <string>
#include <vector>
#include <queue>
#include <map>
using namespace std;
bool CanChange(string wordA, string wordB)
{
int differentAlpNum = 0;
for (int i = 0; i < wordA.size(); ++i)
{
if (wordA[i] != wordB[i])
{
++differentAlpNum;
if (differentAlpNum > 1)
return false;
}
}
return true;
}
int solution(string begin, string target, vector<string> words)
{
map<string, bool> checked;
queue<pair<string, int>> q;
q.push({ begin, 0 });
checked[begin] = true;
while(!q.empty())
{
string curWord = q.front().first;
int curTime = q.front().second;
q.pop();
if (curWord == target)
return curTime;
for (int i = 0; i < words.size(); ++i)
{
string nxtWord = words[i];
if (checked[nxtWord] == true)
continue;
if (CanChange(curWord, nxtWord))
{
checked[nxtWord] = true;
q.push({ nxtWord, curTime + 1 });
}
}
}
return 0;
}