728x90
반응형
https://leetcode.com/problems/number-of-provinces/
1. 연결된 도시를 찾는다.
-> 직접연결과 간접연결
2. 초기값을 전달한 후, 초기값에서 연결된 모든 도시를 찾는다.
3. 연결된 모든 도시 찾기 종료 후, 다음 도시들은 모두 세면서 연결되어있는지 찾는다.
class Solution {
static int answer;
public int findCircleNum(int[][] isConnected) {
//직접 연결과 간접 연결
//[n][n]행렬에서 직접 연결 + 간접 연결된 모든 도시의 수
int n=isConnected.length;
// System.out.println("N"+n);
boolean[] check = new boolean[n];
answer=0;
check[0]=true;
answer++;
DFS(isConnected, isConnected[0], 0, n, check);
for(int i=1;i<n;i++){
if(!check[i]){
// System.out.println("돈다");
answer++;
DFS(isConnected, isConnected[i], i, n, check);
}
}
// System.out.println(answer);
return answer;
}
private void DFS(int[][] isConnected,int [] node, int i, int n, boolean[] check){
for(int j=0; j<n;j++){
if(!check[j] && node[j]==1) {
//System.out.println("이번 : "+j);
check[j]=true;
// for(boolean x : check) System.out.print(x+" ");
// System.out.println();
DFS(isConnected, isConnected[j], j, n, check);
}
}
}
}
+) 세련된 코드
class Solution {
int n=0;
public int findCircleNum(int[][] isConnected) {
//1. ds
n=isConnected.length;
//방문 확인 배열
//: 연결되어있지 않으면 1 연결되어있으면 0
int[] visited = new int[n]; //[0,0,0];
int count=0;
//2. loop
for(int i=0; i<n;i++){
//방문하지 않았을 때
if(visited[i]==0){
DFS(isConnected, visited, i);
count++;
}
}
return count;
}
private void DFS(int[][] isConnected, int[] visited, int i){
//깊이 우선 탐색 : n개만큼 돌면서 연결되어있는 모든 도시를 체크한다.
for(int j=0; j<n;j++){
//연결되어있고, 방문하지 않았을 때
if(isConnected[i][j]==1 && visited[j]==0){
visited[j]=1;
DFS(isConnected, visited, j);
}
}
}
}
728x90
반응형
'Java > Java 알고리즘 LeetCode' 카테고리의 다른 글
[LeetCode- Part. 4] 2. 슬라이딩 윈도우 최댓값 ##(+슬라이딩 윈도우, Deque) (1) | 2022.11.13 |
---|---|
[LeetCode- Part. 4] 1. N일 후 감옥 ## (+ 재귀함수, Arrays.toString, 삼항연산자) (0) | 2022.11.12 |
[LeetCode- Part. 3] 4. 숫자를 영어 단어로 변환 # (+분할과 정복) (0) | 2022.11.12 |
[LeetCode- Part. 3] 3. 가장 느린 키 (+ 초기값 이용, arr[i]-arr[i-1]) (0) | 2022.11.09 |
[LeetCode- Part. 3] 2. 소행성 충돌 (0) | 2022.11.09 |