프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 완전 탐색 문제
- 해당 단어의 사용 여부와 변환 가능 여부를 체크해야함
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// 완전 탐색 문제
// 단어의 사용 여부와 변환 가능 여부를 체크해서 dfs 돌리면 될듯
// target이 words 안에 없을 수도 있음 < 지나칠 뻔
// 방문 여부
bool Used[51] = {false};
// 변환 가능 여부 체크
bool canChange(string str1, string str2) {
int diff = 0;
// 두 단어 간 다른 알파벳의 개수 구하기
for(int i = 0; i < str1.size(); i++)
if(str1[i] != str2[i]) diff++;
// 다른 알파벳의 개수가 1이면 가능 아니면 불가능
if(diff == 1) return true;
else return false;
}
// dfs
void dfs(int cnt, string cur, string target, vector<string> words, int &answer) {
// answer보다 cnt가 커지면 더 볼 필요 없음
if(cnt >= answer) return;
// cur에서 target으로 변환이 가능하면
if(canChange(cur, target)) {
answer = min(answer, ++cnt);
return;
}
// words 배열 내의 단어들 중
for(int i = 0; i < words.size(); i++) {
// 사용한적 없고 변환 가능하면
if(!Used[i] && canChange(cur, words[i])) {
Used[i] = true;
// dfs 수행
dfs(cnt + 1, words[i], target, words, answer);
Used[i] = false;
}
}
}
int solution(string begin, string target, vector<string> words) {
int answer = INT32_MAX;
// target이 words 안에 있는지 체크
if(find(words.begin(), words.end(), target) == words.end()) return 0;
// dfs 수행
dfs(0, begin, target, words, answer);
return answer;
}
'프로그래머스 > 3레벨' 카테고리의 다른 글
[프로그래머스/C++] 부대복귀 (1) | 2024.03.29 |
---|---|
[프로그래머스/C++] 스티커 모으기 (0) | 2024.03.28 |
[프로그래머스/C++] 가장 긴 팰린드롬 (0) | 2024.03.26 |
[프로그래머스/C++] 섬 연결하기 (0) | 2024.03.26 |
[프로그래머스/C++] 여행경로 (0) | 2024.03.26 |