Leetcode Java Is Graph Bipartite?
업데이트:
문제
코드
class Solution {
public boolean isBipartite(int[][] graph) {
int[] sets = new int[graph.length];
for (int idx = 0; idx < graph.length; idx++) {
if (sets[idx] == 0 && !this.dfs(graph, sets, 1, idx)) {
return false;
}
}
return true;
}
private boolean dfs(int[][] graph, int[] sets, int set, int index) {
if (sets[index] != 0) {
return sets[index] == set;
}
sets[index] = set;
for (int node : graph[index]) {
if (!this.dfs(graph, sets, -set, node)) {
return false;
}
}
return true;
}
}
결과
설명
- 아래의 조건을 만족하는 n개의 노드들의 정보인 graph를 이용하여 두 그룹으로 나눌 때 맨 앞과 끝의 노드가 다른 그룹으로 이어져 분리할 수 있는지를 검증하는 문제이다.
- 자기 자신 노드와 연결되는 노드는 없다.
- 한 노드에서 다음 노드로 병렬 연결된 노드는 없다.
- graph[u]에 ‘v’가 포함된 경우, graph[v]에 ‘u’가 포함되어있다. (단, 방향은 지정되어 있지 않다.)
- graph의 각 노드들은 연결되어 있지 않을 수 있다.
- sets는 각 노드 별 아래와 같은 값의 구분을 통해 그룹을 지정할 배열로, graph의 길이 크기로 초기화한다.
- ‘0’은 그룹을 지정하지 않은 노드이다.
- ‘1’은 그룹 A를 의미한다.
- ‘-1’은 그룹 B를 의미한다.
- 0부터 graph의 길이 미만까지 idx를 증가시키며 아래를 반복한다.
- 아래의 조건을 모두 만족하는 경우, 주어진 조건에 따른 두 그룹으로 분리할 수 없으므로 false를 주어진 문제의 결과로 반환한다.
- sets의 idx번째 값이 0인 그룹을 지정하지 않은 노드인 경우.
- 4번에서 정의한 dfs(graph, sets, 1, idx) 메서드의 수행 결과가 false인 분리 불가능한 노드인 경우.
- 아래의 조건을 모두 만족하는 경우, 주어진 조건에 따른 두 그룹으로 분리할 수 없으므로 false를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 조건에 따른 그룹 분리가 가능한지 검증하기 위한 dfs(graph, sets, 1, idx) 메서드를 정의한다.
- sets의 index번째 그룹이 0이 아닌 경우, 해당 위치의 값이 set인지 검증한 결과를 반환한다.
- sets의 index번째 그룹에 set을 넣어 그룹을 분류한다.
- graph의 index번째 노드 정보들을 node에 넣어 아래를 반복 수행한다.
- set의 값을 다른 그룹 값으로 전환하여 재귀 호출을 수행한 결과가 false인 경우, 조건에 따른 분리가 불가능하므로 false를 반환한다.
- 위의 모든 절차가 완료되면 index번째 노드의 위치에서 검증이 완료되었으므로 true를 반환한다.
- 3번의 반복이 완료되면 조건에 따른 분리가 가능한 것으로 검증되었으므로 true를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기