네트워크 (LEVEL3)
문제
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
제한사항
- 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
- 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
- i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
- computer[i][i]는 항상 1입니다.
입출력
n | computers | return |
3 | [[1, 1, 0], [1, 1, 0], [0, 0, 1]] | 2 |
3 | [[1, 1, 0], [1, 1, 1], [0, 1, 1]] | 1 |
summary
네트워크 개수(연결안된 컴퓨터 개수) 구하기
- 컴퓨터들의 연결 정보는 computers[i][j]를 1로 표현
strategy
너비우선탐색을 통해 연결되어 있는 컴퓨터들 모두 방문
- 이미 방문한 컴퓨터 중복 방문을 방지하기 위해 방문체크 (visited[])
- 현재 방문중인 컴퓨터는 (current)
- 다음 방문예정인 컴퓨터를 저장 (Queue)
note
- n은 1 이상 200 이하인 자연수
import java.util.*;
class Solution {
static boolean visited[];
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
for(int i = 0; i < n; i++) {
if(visited[i]) continue;
Queue<Integer> q = new ArrayDeque<>();
q.add(i);
while(!q.isEmpty()) {
int currnet = q.poll();
for(int j = 0; j < n; j++) {
if(computers[currnet][j] == 0 || visited[j]) continue; // 네트워크 연결 여부 또는 방문기록
visited[j] = true; // 방문 표시
q.add(j);
}
}
answer++;
}
return answer;
}
}
MEMO
- 위아래좌우로 이동하는 그래프에만 익숙해있어서 BFS 인지 바로 알아차리지 못했다. (반성)
- 그래서 처음에는 서로소 집합 해결법으로 생각했다.
import java.util.*;
class Solution {
// Union-Find Data Structure
static int[] parent;
// Find with path compression
static int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
// Union by rank
static void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX; // Simple union
}
}
public int solution(int n, int[][] computers) {
// Initialize parent array
parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
// Union connected computers
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (computers[i][j] == 1) {
union(i, j);
}
}
}
// Count unique networks
Set<Integer> networkSet = new HashSet<>();
for (int i = 0; i < n; i++) {
networkSet.add(find(i));
}
return networkSet.size();
}
}
- BFS 문제를 DFS 로도 푸는 연습이 필요한것같다.
import java.util.*;
class Solution {
static boolean visited[];
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
for(int i = 0; i < n; i++) {
if(!visited[i]) {
DFS(n, computers, i);
answer++;
}
}
return answer;
}
public static void DFS(int n, int[][] computers, int current) {
visited[current] = true; // 방문처리
for(int i = 0; i < n; i++) {
if(computers[current][i] == 1 && !visited[i]) { // 인접 네트워크 확인
DFS(n, computers, i);
}
}
}
}
'문제 풀이 > 프로그래머스' 카테고리의 다른 글
[JAVA 10] 이중우선순위큐 (0) | 2024.09.04 |
---|---|
[MYSQL 12] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.09.04 |
[MYSQL 11] 5월 식품들의 총매출 조회하기 (1) | 2024.09.03 |
[MYSQL 10] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.09.03 |
[MYSQL 09] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (1) | 2024.09.02 |