Algorithm
[백준 Gold 4] 20040 사이클 게임 - Java
Ray
2022. 1. 3. 20:34
문제링크 : https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
접근 과정 :
- 분리 집합으로 접근하면 간단하다.
- 연결 정보에 따라서 집합으로 합쳐주고. 만약 집합의 번호가 같으면 사이클이 형성된다!!
- 사이클이 형성될 때, i를 리턴한다.
+++
비슷한 문제 : https://rays-space.tistory.com/74
[백준 Gold 4] 4803 트리 - Java
문제링크 : https://www.acmicpc.net/problem/4803 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다." data-og-host="www.acmicpc.net" data-og-source-url="https://www.acmicpc.net/probl..
rays-space.tistory.com
20040을 풀고 4803을 풀면 사이클 문제는 익숙해지지 않을까싶다.
소스 코드 및 결과 :
package BOJ;
/*
사이클 게임
*/
import java.io.*;
import java.util.*;
public class BOJ20040 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
setRoot(n);
for (int i = 1; i <= m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
a = findRoot(a);
b = findRoot(b);
if (a == b) {
System.out.println(i);
return;
}
root[b] = a;
}
System.out.println(0);
}
static int[] root;
static void setRoot(int n) {
root = new int[n];
for (int i = 0; i < n; i++) {
root[i] = i;
}
}
static int findRoot(int x) {
if (root[x] == x) {
return x;
}
return root[x] = findRoot(root[x]);
}
}
P.S
개인적으로 입력의 중간에 결과가 나왔다고 리턴하는 것을 좋아하지 않는다..
그런데 해당 문제에서는 그렇게 해야 속도가 좀 빠르게 나오더라..