📝 문제
https://programmers.co.kr/learn/courses/30/lessons/43162
🎯 풀이
❌ 상하좌우 풀이
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
for(int x = 0; x < computers.length; x++){
for(int y = 0; y < computers.length; y++){
if(computers[x][y] == 1){
DFS(x, y, computers);
answer++;
}
}
}
return answer;
}
public void DFS(int x, int y, int[][] computers){
if(x < 0 || y < 0 || x >= computers.length || y >= computers.length)
return;
if(computers[x][y] == 1){
computers[x][y] = 0;
DFS(x-1, y, computers);
DFS(x+1, y, computers);
DFS(x, y-1, computers);
DFS(x, y+1, computers);
}
}
}
N*N 행렬 기준으로 상하좌우 DFS 탐색을 진행하면서
이어지는 ‘1’을 모두 ‘0’으로 바꿔주고,
DFS 탐색이 진행되는 횟수를 카운트해서 반환하는 코드였다.
“실패” 퍼레이드가 펼쳐졌는데, 그 이유는 매우 단순하게도
인접한 노드(1-2, 4-5, 9-8)간의 연결에는 이 코드가 동작되지만,
인접하지 못한 노드(1-9, 5-8)간의 연결은 이 코드가 판별을 못한다.
상하좌우 말고, 노드별 방문 기록을 이용하는 전통적인 DFS로 구현해보자.
⭕ 방문기록 풀이
class Solution {
public int solution(int n, int[][] computers) {
// 방문기록 배열, 네트워크 개수 변수.
boolean[] visited = new boolean[n];
int answer = 0;
// 모든 노드 시작!
for(int source = 0; source < computers.length; source++){
if(!visited[source]){ // 방문기록이 없으면 네트워크 개수 증가시키고 DFS탐색.
answer++;
DFS(source, visited, computers);
}
}
return answer;
}
public void DFS(int source, boolean[] visited, int[][] computers){
visited[source] = true; // 방문체크.
for(int destination = 0; destination < computers.length; destination++){
// 연결은 되어 있는데, 아직 방문 안했다면 재귀탐색 시작.
if(computers[source][destination] == 1 && !visited[destination])
DFS(destination, visited, computers);
}
}
}
👏👏👏
댓글남기기