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
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 정수 삼각형 문제 (0) | 2020.02.09 |
---|---|
[프로그래머스] 여행 경로 문제 (0) | 2020.02.05 |
[프로그래머스] 네트워크 문제 (0) | 2020.02.03 |
[프로그래머스] 단속카메라 문제 (0) | 2020.02.01 |
[프로그래머스] 섬 연결하기 문제 (0) | 2020.01.31 |