티스토리 뷰
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);
}
}
'프로그래머스 (Programmers)' 카테고리의 다른 글
[프로그래머스 (Java)] 여행경로 (0) | 2022.01.03 |
---|---|
[프로그래머스 (Java)] 네트워크 (0) | 2022.01.02 |
[프로그래머스 (Java)] 타겟넘버 (0) | 2022.01.02 |
[프로그래머스 (Java)] 카펫 (0) | 2022.01.02 |
[프로그래머스 (Java)] 소수찾기 (0) | 2022.01.02 |
댓글