티스토리 뷰
반응형
프로그래머스 알고리즘 - 단어변환
문제의 핵심은 각 word를 노드로 두고, 변환 가능한 word간에는 간선(edge)로 연결해둔 다음에 그래프 탐색을 진행하면 어렵지 않은 문제 였습니다.
문제풀이
- 코드의 전체적인 틀은 그래프 탐색을 응용합니다.
class Graph {
private Word[] words;
. . .
}
class Word {
private String name;
private List<Word> changeable; //인접 노드(Word)들을 저장하는 리스트
private boolean visited;
. . .
}
class Word {
. . .
boolean checkChangeable(Word word) {
int countIncorrect = 0;
for (int i = 0; i < name.length(); i++) {
if (this.name.charAt(i) != word.getName().charAt(i)) {
countIncorrect++;
}
if (countIncorrect > 1) {
return false;
}
}
return countIncorrect == 1;
}
void addChangeable(Word[] words) {
for (Word word : words) {
if (checkChangeable(word)) {
changeable.add(word);
}
}
}
}
class Graph {
. . .
boolean checkTargetExist() {
for (Word word : words) {
if (word.getName().equals(target)) {
return true;
}
}
result = 0;
return false;
}
}
class Graph {
. . .
void findShortestPath(Word word, int step) {
if (word.isVisited()) {
return;
}
if (word.getName().equals(target)) {
if (result == -1) {
result = step;
}
result = Math.min(step, result);
return;
}
. . .
}
}
class Graph {
. . .
void findShortestPath(Word word, int step) {
. . .
word.setVisited(true);
for (Word w : word.getChangeable()) {
findShortestPath(w, step + 1);
}
word.setVisited(false);
}
배운점
- 그래프 탐색 구현을 까먹지 않고 해냈다!
- 경로 탐색 문제들에서 항상 막혔던 부분이 이미 방문했던 노드들의 방문 표식을 언제 false로 바꿔 줄까 였는데, for문이 돌고 나서 dfs메소드를 빠져나가지 전에 하면 됐다! 비슷한 문제들도 이런식으로 접근 해야겠다.
- 문제 카테고리가 DFS/BFS인지 몰랐다면 문제의 풀이를 생각해내기 어려웠을 것 같다. 언제 그래프 문제를 쓰는지 조금은 감이 잡힌 것 같다. 요소가 있고 그 요소를 순차적으로 이동한다거나, 몇단계를 이동했는지 묻는 문제가 있다면 그래프 탐색을 떠올려야 겠다.
반응형
'Algorithm' 카테고리의 다른 글
해시(Hash)란 무엇인가? (8) | 2019.01.12 |
---|---|
백준 알고리즘 - 케빈 베이컨의 6단계 법칙 (1389번) (0) | 2019.01.10 |
순열(permutation) 알고리즘 (2) | 2019.01.03 |
백준 알고리즘 - 프린터 큐 (1966번) (0) | 2019.01.02 |
프로그래머스 알고리즘 - 네트워크 (0) | 2018.12.29 |
댓글