Hello Ocean! ๐ŸŒผ

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋‹จ์–ด ๋ณ€ํ™˜ ๋ณธ๋ฌธ

Algorithm

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

bba_dda 2022. 1. 12. 23:26
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

๋‘ ๊ฐœ์˜ ๋‹จ์–ด 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

ํ’€์ด

๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ 10์ดํ•˜์ด๊ณ ,

์ด ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋Š” 50๊ฐœ ์ดํ•˜์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋„๋„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

BFS๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ–ˆ์œผ๋ฉฐ,

words ๊ธธ์ด๋งŒํผ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ด์šฉํ–ˆ๋‹ค.

 

๋ฌธ์ œ๋Š” ๊ธธ์—ˆ์ง€๋งŒ, ๊ผฌ์ง€ ์•Š์€? ๋ฌธ์ œ์—ฌ์„œ ์ •ํ˜•ํ™”๋œ ํ’€์ด๋กœ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฝ”๋“œ 

#include <string>
#include <vector>
#include <queue>

using namespace std;
bool isCanConvert(string begin, string target) {
    int count = 0;
    for(int i=0;i<begin.size();i++) 
        if (begin[i] != target[i]) count++;
    return count <= 1;
}
int BFS(string begin, string target, vector<string> words) {
    vector<bool> visited(words.size());
    queue<pair<string, int>> q;
    q.push({begin, 0});
    
    while(!q.empty()) {
        string temp = q.front().first;
        int count = q.front().second;
        q.pop();
        
        for(int i=0; i<words.size();i++) {
            if (visited[i]) continue;
            if (!isCanConvert(temp, words[i])) continue;
            if (words[i] == target) return count + 1;
            
            visited[i] = 1;
            q.push({words[i], count + 1});
        }
    }
    return 0;
    
}
int solution(string begin, string target, vector<string> words) {
    int answer = 0;
    answer = BFS(begin, target, words);
    return answer;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•