정점 개수 n과 무방향 간선 목록 edges가 주어져요. 정점은 0번부터 n-1번까지 있어요. 이 그래프에 사이클이 있으면 true, 없으면 false를 반환해요.
간선을 하나씩 보면서, 두 끝점이 이미 같은 무리에 속해 있다면 그 간선이 무리를 한 바퀴 잇는 셈이라 사이클이 생겨요. 아직 다른 무리면 둘을 합쳐요.
자기 자신을 잇는 간선(self-loop)도 사이클로 봐요.
예시
예시 1
예시 2
제한 사항
- 1 ≤ n ≤ 100,000
- 0 ≤ edges.length ≤ 200,000
- 0 ≤ a, b < n
parent를 자기 자신으로 시작해요. 각 간선의 두 끝점 대표를 찾아 같으면 사이클이니 바로 true를 반환하고, 다르면 두 무리를 합쳐요. 모든 간선을 봐도 걸리지 않으면 false예요.javascriptCopy codefunction graphCycle(n, edges) {const parent = Array.from({ length: n }, (_, i) => i);function find(x) {while (parent[x] !== x) {parent[x] = parent[parent[x]];x = parent[x];}return x;}for (const [a, b] of edges) {const ra = find(a);const rb = find(b);if (ra === rb) return true;parent[ra] = rb;}return false;}
이전 문제유니온 파인드 구현
다음 문제크루스칼 MST
예시 테스트만 실행 (Cmd/Ctrl+Enter)
숨김 테스트까지 채점 (Cmd/Ctrl+Shift+Enter)
에디터를 불러오고 있어요…
코드를 작성하고Ctrl↵를 눌러 예시 테스트를 확인해 보세요.