Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 뮤텍스란?
- 삼성 청년 SW 아카데미
- 웹 호스팅
- 프록시서버
- Dijkstra Algorithm
- Synchronization
- 싸피 합격
- 최단 경로
- 세마포어란?
- 동기화
- 서버 호스팅
- 세마포어와 뮤텍스의 차이
- 호스팅이란?
- 호스팅
- 플로이드 와샬
- 뮤텍스
- Proxy Server
- 다익스트라 알고리즘
- SSAFY
- floyd-warshall
- 싸피
- 프록시
- 클라우드 서버
- 세마포어
- 다익스트라
- 싸피 면접 후기
- 플로이드 워셜
- 세마포어와 뮤텍스
- Proxy
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
[프로그래머스][Level3][Java] 네트워크 본문
programmers.co.kr/learn/courses/30/lessons/43162
문제풀이
보자마자 Union-find 알고리즘이 생각나서 Level3 치고는 쉽게 풀었다.
그러나 마지막에 고려하지 않은 한가지가 있었다.
먼저 1와 2의 부모가 3으로 연결 되었고
다음으로는 4와 5의 부모가 6이 되었을때는 2개의 네트워크이지만 마지막에 3과 6의 부모가 생겨버리면 네트워크는 1이 되어 버린다. 그래서 마지막에 네트워크를 찾을때 반복문 parents[i]로 찾아 버리면 틀린 답이 나온다. 이에 parents[i]로 찾는것이 아닌 for문을 돌면서 check[find(i)]로 부모를 통일 시켜 주면서 네트워크 갯수를 찾아야 한다.
코드
class Solution {
int[] parents;
public int solution(int n, int[][] computers) {
make(n);
for(int i = 0; i<n; i++) {
for(int j =0; j<n; j++) {
if(i==j) continue;
if(computers[i][j] == 1) union(i,j);
}
}
int[] check = new int[n];
for(int i =0; i<n; i++) {
check[find(i)] ++;
}
int answer= 0;
for(int i =0; i<n; i++) {
if(check[i] > 0) answer++;
}
return answer;
}
private int find(int a) {
if (parents[a] == a) return a;
return parents[a] = find(parents[a]);
}
private void union(int a, int b) {
int aRoot = find(a);
int bRoot = find(b);
if ( aRoot == bRoot) return;
parents[bRoot] = aRoot;
return;
}
private void make(int n) {
parents = new int[n];
for(int i =0; i<n; i++) {
parents[i] = i;
}
}
}
'알고리즘 > 프로그래머스(Programmers)' 카테고리의 다른 글
[프로그래머스][Level2][Java] 압축 (0) | 2020.12.25 |
---|---|
[프로그래머스][Level3][Java] 이중우선순위큐 (0) | 2020.12.25 |
[프로그래머스][Level2][Java] 위장 (0) | 2020.12.24 |
[프로그래머스][Level2][Java] 카카오프렌즈 컬러링북 (0) | 2020.12.23 |
[프로그래머스][Level2][Java] 전화번호 목록 (0) | 2020.12.23 |
Comments