본문으로 바로가기

[프로그래머스] 단어 변환 문제

category 알고리즘/문제풀이 2020. 2. 4. 19:53

Lv3, bfs를 활용하는 문제였습니다.


문제 보기

두 개의 단어 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

입출력 예 설명

예제 #1
문제에 나온 예와 같습니다.

예제 #2
target인 cog는 words 안에 없기 때문에 변환할 수 없습니다.


<내 풀이>

bfs를 활용했고 한 번에 한 개의 알파벳만 바꿀 수 있다는 전제 조건에 맞게

변환가능한 word들을 탐색하고 몇번 변환했는지를 반환하게 했습니다.

방문했던 word를 중복으로 탐색하지 않도록 visited변수를 활용했습니다.

 

 

코드

 

import java.util.*;

class Solution {
    int answer = 0;
    boolean visited[];

    public boolean difCheck(String tmp, String target){
        int cnt=0;
        for(int i=0; i<tmp.length(); i++){
            if(tmp.charAt(i)==target.charAt(i)){
                cnt++;
            }
        }
        if(cnt==tmp.length()-1){
            return true;
        }
        return false;
    }

    void bfs(int index, String[] words, String begin, String target, int stage) {
        LinkedList<Integer> queue = new LinkedList<Integer>();

        if (index == 0) {
            for (int i = 0; i < words.length; i++) {
                if (difCheck(begin, words[i]) == true) {
                    queue.add(i);
                    visited[i] = true;
                }
            }
        }
        while (!queue.isEmpty()) {
            int x = queue.getFirst();
            queue.pollFirst(); // 맨 앞에 수 빼기
            stage++;
            System.out.println(words[x]);
            if (words[x].compareTo(target)==0) {
                answer = stage;
                return;
            }
            for (int i = 0; i < words.length; i++) {
                if (visited[i] == false && difCheck(words[x], words[i])) {
                    queue.push(i);
                    visited[i] = true;
                }
            }
        }
        answer = 0;
    }

    public int solution(String begin, String target, String[] words) {
        visited = new boolean[words.length];
        bfs(0, words, begin, target, 0);

        return answer;
    }
}

풀다풀다 헤매고 다른분의 답안도 참고하게 되었으므로 다음번에 다시 풀어보기를 기약 ㅜㅜ

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/43163?language=java

 

코딩테스트 연습 - 단어 변환 | 프로그래머스

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다. 2. words에 있는 단어로만 변환할 수 있습니다. 예를 들어 begin이 hit, target가 cog, words가 [hot,dot,dog,lot,log,cog]라면 hit -> hot -> dot -> dog ->

programmers.co.kr