본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 단어 변환] c++ (풀이, 코드, bfs)

by 말린밴댕이_공부 2023. 6. 23.
반응형

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이, 코드

bfs의 문제로 level3이지만 아주 간단한 bfs가 아닐까 생각합니다.

 

우선 둘과의 차이가 1개가 나는것에 대해서(중복이 없으니 0개는 없음)

방문을 하지 않았다면 q.push({cnt + 1,words[i]})를 통해 반복문이 계속 돌아가게 되는 구조 입니다.

 

사실 bfs의 가장 정석적인 문제라 

bfs에 대한 기초적인 방식인

처음에 push를 한다 -> 반복문을 큐가 빌때까지 돈다 -> 원하는 데이터를 뽑아온후 pop을한다 

-> 찾는 데이터가 있다면 return을 한다(그게 아닐시에는 q가 다 비워지며 반복문을 탈출하게 됨)

 

 

/*
단어 변환

한번에 한개의 알파벳만 words에 있는 단어로만 변환 o

최소 몇단계를 과정을 거쳐서 변환할 수 있는지에 대해서 하는 것이니 bfs를 사용해보자.
*/
#include <string>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

int solution(string begin, string target, vector<string> words) {
    int answer = 0;
    queue<pair<int,string>> q; //횟수, word
   
    int visited[50]={0,};
    q.push({0,begin});
   
    while(!q.empty()){
        int cnt = q.front().first;
        string name = q.front().second;
       
        q.pop();
       
        if(name == target)
            return cnt;
       
        for(int i = 0; i < words.size();i++){
            int diff = 0;
            for(int j = 0; j < name.length();j++){
                if(name[j] != words[i][j])
                    diff++;
            }
            if(diff == 1 && visited[i] == 0){
                visited[i] = 1;
                q.push({cnt + 1,words[i]});
            }
        }
    }
    return answer;
}

 

반응형

댓글