티스토리 뷰

 

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

 

코딩테스트 연습 - 단어 변환

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수

programmers.co.kr

단어를 변환하는데 필요한 최소 횟수를 반환하는 문제이기 때문에 bfs 를 이용해 모든 경우를 확인하다가 단어를 바꿀 수 있는 tree 의 depth 를 반환하는 방식으로 코드를 작성할 수 있습니다.

import java.util.*;

class Solution {
    public boolean canChange(String from, String to) {
        int count = 0;
        if (from.length() != to.length()) {
            return false;
        }
        for (int i = 0; i < from.length(); i++) {
            if (from.charAt(i) != to.charAt(i)) {
                count += 1;
            }
            if (count > 1) {
                return false;
            }
        }
        return count == 0 ? false : true;
    }

    public int bfs(int count, String target, Set<String> prev, Set<String> unchecked) {
        Set<String> next = new HashSet<>();
        for (String p : prev) {
            for (Iterator<String> iter = unchecked.iterator(); iter.hasNext(); ) {
                String n = iter.next();
                if (canChange(p, n)) {
                    next.add(n);
                    iter.remove();
                }
            }
        }
        count++;
        if (next.isEmpty()) {
            return 0;
        }
        if (next.contains(target)) {
            return count;
        }
        return bfs(count, target, next, unchecked);
    }

    public int solution(String begin, String target, String[] words) {
        Set<String> start = new HashSet<>(Collections.singletonList(begin));
        Set<String> unchecked = new HashSet<>(Arrays.asList(words));
        if (!unchecked.contains(target)) {
            return 0;
        }
        return bfs(0, target, start, unchecked);
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함