alorithm/programmers

[LeetCode] Is Graph Bipartite?

Hannana. 2024. 8. 13. 01:59
728x90
반응형

https://leetcode.com/problems/is-graph-bipartite/

 

 

문제 파악

-0~n까지의 노드가 주어지고 각 노드의 간선 status가 주어짐

-이분 그래프 true or false 찾아라

  • graph.length == n
  • 1 <= n <= 100
  • 0 <= graph[u].length < n
  • 0 <= graph[u][i] <= n - 1
  • graph[u] does not contain u.
  • All the values of graph[u] are unique.
  • If graph[u] contains v, then graph[v] contains u.

접근 방법

-이분 그래프 :

  • 두 개의 독립된 집합으로 정점을 나눌 수 있다.
  • 모든 간선이 한 집합의 정점과 다른 집합의 정점을 연결해야 한다.

-"독립적"이라는 말은 같은 그룹의 정점들끼리는 직접 연결된 간선이 없다는 뜻

⇒ 그래프를 돌며 노드 하나씩 순회 → 순회하면서 해당 노드의 그룹(color) 조회 → 연결

⇒ 색칠하는 도중 인접한 정점이 같은 색으로 색칠되어야만 하는 상황이 발생하면 이분 그래프가 아니라고 판단

 

코드 구현

import java.util.*;
class Solution {
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        int[] color = new int[n];
        for(int i=0;i<n;i++){//여기로 돌아오려면 color가 1 혹은 -1이면서 자식과 색이 달라 통과한 경우
            if(color[i]==0){//방문했는데도 또 돌 수도 있으니 부모노드도 0인지 아닌지 검증해줘야 함
                Queue<Integer> que = new ArrayDeque<>();
                que.add(i);
                color[i] = 1;
                while(!que.isEmpty()){
                    int node = que.poll();
                    for(int k:graph[node]){
                        if(color[k]==0){//방문 아직 안한 자식이라면
                            color[k] = -color[node];//자식(연결된 노드)가 다른 그룹이 되게 함. 1이면 -1 배척해버리기
                            que.add(k);
                        }else if(color[k]==color[node]){//자식 정점이 이미 그룹이 있고, 부모와 같은 집합에 속한거라면
                            return false;// 이분 그래프가 아님. 바로 리턴
                        }
                    }
                }
            }
        }
        return true;// 모든 정점이 두 집합으로 나눌 수 있음
    }
}

배우게 된 점

뭔가 땅따먹기하는 것처럼.. 색을 하나씩 칠해가며 그룹 선점을 해가는 방식처럼 느껴졌다.

어떠한 기준을 먼저 정하고(기준:부모와 자식은 같은 그룹일 수 없다.) → 그에 따라 선점해가며

만일 돌다가 자식=부모라면 주저없이 리턴.

dfs나 bfs를 풀면서 이런 경우의 문제는 처음 봐서 당황스러웠지만

역시나 방문을 했는지 안했는지 체크하는 로직 visited 개념과, 그 인접 노드를 구하기 위한 큐 자료구조까지

전체적인 틀은 비슷했다.

 

 

 

반응형

'alorithm > programmers' 카테고리의 다른 글

[프로그래머스] 미로 탈출  (0) 2024.08.13
[LeetCode] Keys and Rooms  (0) 2024.08.13
[LeetCode] Coin Change  (0) 2024.08.13
[프로그래머스] 네트워크  (0) 2024.08.13
[프로그래머스] 단어 변환  (0) 2024.08.13