๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๋‹จ์–ด ๋ณ€ํ™˜

by Jaeguk 2022. 6. 20.
๋ฌธ์ œ ๋งํฌ

https://programmers.co.kr/learn/courses/30/lessons/43163

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋‹จ์–ด ๋ณ€ํ™˜

๋‘ ๊ฐœ์˜ ๋‹จ์–ด begin, target๊ณผ ๋‹จ์–ด์˜ ์ง‘ํ•ฉ words๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ด์šฉํ•˜์—ฌ begin์—์„œ target์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ณ€ํ™˜ ๊ณผ์ •์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 1. ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜

programmers.co.kr

๋‘ ๊ฐœ์˜ ๋‹จ์–ด begin, target์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, begin ๋‹จ์–ด๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ target ๋‹จ์–ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋ณ„ํ•ด๋ณด๊ณ  ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ตœ์†Œ ๋ช‡๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผํ•˜๋Š”์ง€ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ.

 

ํ’€์ด
1. ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. words์— ์žˆ๋Š” ๋‹จ์–ด๋กœ๋งŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€‹

 ๋‹จ์–ด๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ ์œ„์™€ ๊ฐ™๋‹ค.

 ์ฆ‰, ํ˜„์žฌ ๋‹จ์–ด๋ฅผ now๋ผ๊ณ  ํ–ˆ์„ ๋•Œ words์— ์žˆ๋Š” ๋‹จ์–ด๋“ค ์ค‘์— now์™€ ์•ŒํŒŒ๋ฒณ ํ•˜๋‚˜๋งŒ ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 DFS๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 DFS์˜ ๊นŠ์ด๋ฅผ depth๋ผ๊ณ  ํ–ˆ์„ ๋•Œ depth๋Š” ๋‹จ์–ด์˜ ๋ณ€ํ™˜ ํšŸ์ˆ˜์™€ ๊ฐ™๋‹ค.

 ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ตœ๋Œ€ ๊นŠ์ด๋Š” words.size()์™€ ๊ฐ™๋‹ค. depth์™€ words.size()๊ฐ€ ๊ฐ™์•„์กŒ๋‹ค๋Š” ๊ฑด words์— ์žˆ๋Š” ๋ชจ๋“  ๋‹จ์–ด๋“ค์„ ์ด์šฉํ•ด์„œ ๋ณ€ํ™˜์„ ํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋•Œ ์šฐ๋ฆฌ๋Š” 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. ํ˜„์žฌ ๋‹จ์–ด์—์„œ target์œผ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ํ˜„์žฌ ๋‹จ์–ด์—์„œ target์œผ๋กœ ๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

1๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” depth๊ฐ€ ์ตœ์†Œ ๋ณ€ํ™˜ํšŸ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•ด์„œ answer๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ๊ณ , 2๋ฒˆ์˜ ๊ฒฝ์šฐ๋ผ๋ฉด ๊ทธ๋ƒฅ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 ๋งŒ์•ฝ depth๊ฐ€ words.size()๊ฐ€ ๋˜๊ธฐ ์ „์— ์ฆ‰ words์— ์žˆ๋Š” ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ target์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉด ์ด๋•Œ์˜ ๋ณ€ํ™˜ํšŸ์ˆ˜๊ฐ€ ์ตœ์†Œ์ธ์ง€ ํŒ๋ณ„ํ•˜๊ณ  ์ตœ์†Œ๋ผ๋ฉด answer๊ฐ’์„ ๊ฐฑ์‹ ํ•œ ๋’ค ๋ฆฌํ„ด ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ฆฌํ„ด.

 ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ๋ณ€ํ™˜ํ–ˆ๋˜ ๋‹จ์–ด๋กœ ๊ตณ์ด ๋‹ค์‹œ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ณ€ํ™˜ํ–ˆ๋˜ ๋‹จ์–ด๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ–ˆ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX_N = 50 + 5;
bool visited[MAX_N];
 
void backtracking(int depth, string now, string target, vector<string> words, int &answer){
    if(depth == words.size()){
        if(now == target){
            answer = min(answer,depth);
        }
        return;
    }
    if(now == target){
        answer = min(answer, depth);
        return;
    }
    for(int i = 0; i<words.size(); i++){
        int cnt = 0;
        for(int j = 0; j<words[i].length(); j++)
            if(now[j] != words[i][j])
                cnt++;
        if(cnt == 1 && !visited[i]){
            visited[i] = true;
            backtracking(depth + 1, words[i], target, words, answer);
            visited[i] = false;
        }
    }
}
int solution(string beginstring target, vector<string> words) {
    int answer = 100;
    backtracking(0begin, target, words, answer);
    if(answer == 100)
        return 0;
    return answer;
}
cs

 

728x90