반응형
문제
https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
풀이
유니온 파인드 알고리즘을 활용하여 풀이할 수 있는 문제입니다.
사이클이 완성되는 경우는 어떠한 경우일까요?
현재 1, 2, 3이 다음과 같이 연결되어있다고 가정해봅시다.

현재 2와 3의 부모노드는 1로 같습니다. 2와 3을 연결하면 사이클을 발생시킵니다.
즉, 같은 부모노드를 가진 것 끼리 연결하게 된다면 사이클이 생성되게 됩니다.
그러므로, 연결을 하기 전에 같은 두 노드가 같은 부모노드인지 확인을 하고 같은 부모노드라면 연결을 하게되면 사이클이 발생되므로
그 당시의 차례의 번호를 출력해주면 됩니다.
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let input = readLine()!.split(separator: " ").map { Int($0)! } | |
let n = input[0], m = input[1] | |
var parent = [Int](0..<n) | |
func find(_ x: Int) -> Int { | |
if parent[x] == x { | |
return x | |
} | |
parent[x] = find(parent[x]) | |
return parent[x] | |
} | |
func union(_ a: Int, _ b: Int) { | |
let a = find(a) | |
let b = find(b) | |
if a == b { | |
return | |
} | |
if a > b { | |
parent[a] = b | |
} else { | |
parent[b] = a | |
} | |
} | |
func isSameParent(_ a: Int, _ b: Int) -> Bool { | |
return find(a) == find(b) | |
} | |
var answer = 0 | |
for i in 1...m { | |
let input = readLine()!.split(separator: " ").map { Int($0)! } | |
let a = input[0], b = input[1] | |
if isSameParent(a, b) { | |
answer = i | |
break | |
} | |
union(a, b) | |
} | |
print(answer) |
후기
유니온 파인드를 활용한 문제이며, MST를 알고있었다면 쉽게 풀 수 있는 문제였습니다.
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 1197 최소 스패닝 트리 (Swift) (0) | 2023.05.16 |
---|---|
[BOJ] 백준 9372 상근이의 여행 (Swift) (0) | 2023.05.16 |
[BOJ] 백준 4195 친구 네트워크 (Swift) (0) | 2023.05.16 |
[BOJ] 백준 1976 여행 가자 (Swift) (0) | 2023.05.16 |
[BOJ] 백준 1717 집합의 표현 (Swift) (1) | 2023.05.16 |