문제 난이도 : Easy
문제 유형 : Data Structures - Queue
문제 설명 간략 :
4자리 자물쇠가 주어지고 걸리면 안되는 deadends 배열이 주어진다. deadends를 피해 target 번호까지 맞출 수 있는 최소 횟수를 구하여라.
제약사항
- 1 <= deadends.length <= 500
- deadends[i].length == 4
- target.length == 4
- target will not be in the list deadends.
- target and deadends[i] consist of digits only.
자바 풀이
class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> dead_ends = new HashSet(Arrays.asList(deadends));
HashSet<String> visited = new HashSet();
visited.add("0000");
Queue<String> queue = new LinkedList();
queue.offer("0000");
int level = 0;
while(!queue.isEmpty()) {
int size = queue.size();
while(size > 0) {
String lock_position = queue.poll();
if(dead_ends.contains(lock_position)) {
size--;
continue;
}
if(lock_position.equals(target)) {
return level;
}
StringBuilder sb = new StringBuilder(lock_position);
for(int i = 0; i < 4; i++) {
char current_position = sb.charAt(i);
String s1 = sb.substring(0,i)+(current_position == '9' ? 0 : current_position - '0' +1)
+ sb.substring(i+1);
String s2 = sb.substring(0,i)+(current_position == '0' ? 9 : current_position - '0' -1)
+ sb.substring(i+1);
if(!visited.contains(s1) && !dead_ends.contains(s1)) {
queue.offer(s1);
visited.add(s1);
}
if(!visited.contains(s2) && !dead_ends.contains(s2)) {
queue.offer(s2);
visited.add(s2);
}
}
size--;
}
level++;
}
return -1;
}
}
출처