|
| 1 | +# 사이클 게임 Solution |
| 2 | +(https://www.acmicpc.net/problem/20040) |
| 3 | + |
| 4 | +작성일: 2023. 05. 03. 수 |
| 5 | + |
| 6 | +작성자: 이재현 |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +``` |
| 11 | +문제 |
| 12 | +사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, |
| 13 | +후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한 번호가 부여된 평면 상의 점 |
| 14 | +n 개가 주어지며, 이 중 어느 세 점도 일직선 위에 놓이지 않는다. 매 차례 마다 플레이어는 두 점을 선택해서 |
| 15 | +이를 연결하는 선분을 긋는데, 이전에 그린 선분을 다시 그을 수는 없지만 이미 그린 다른 선분과 교차하는 것은 가능하다. |
| 16 | +게임을 진행하다가 처음으로 사이클을 완성하는 순간 게임이 종료된다. 사이클 C는 플레이어가 그린 선분들의 부분집합으로, |
| 17 | +다음 조건을 만족한다. |
| 18 | +
|
| 19 | +C에 속한 임의의 선분의 한 끝점에서 출발하여 모든 선분을 한 번씩만 지나서 출발점으로 되돌아올 수 있다. |
| 20 | +
|
| 21 | +문제는 선분을 여러 개 그리다 보면 사이클이 완성 되었는지의 여부를 판단하기 어려워 |
| 22 | +이미 사이클이 완성되었음에도 불구하고 게임을 계속 진행하게 될 수 있다는 것이다. |
| 23 | +이 문제를 해결하기 위해서 게임의 진행 상황이 주어지면 몇 번째 차례에서 사이클이 완성되었는지, |
| 24 | +혹은 아직 게임이 진행 중인지를 판단하는 프로그램을 작성하려 한다. |
| 25 | +
|
| 26 | +입력으로 점의 개수 n과 m 번째 차례까지의 게임 진행 상황이 주어지면 사이클이 완성 되었는지를 판단하고, |
| 27 | +완성되었다면 몇 번째 차례에서 처음으로 사이클이 완성된 것인지를 출력하는 프로그램을 작성하시오. |
| 28 | +
|
| 29 | +입력 |
| 30 | +입력은 표준입력을 사용한다. 입력의 첫 번째 줄에는 점의 개수를 나타내는 |
| 31 | +정수 3 ≤ n ≤ 500,000 과 진행된 차례의 수를 나타내는 정수 3 ≤ m ≤ 1,000,000 이 주어진다. |
| 32 | +게임에서 사용하는 n개의 점에는 0 부터 n − 1 까지 고유한 번호가 부여되어 있으며, |
| 33 | +이 중 어느 세 점도 일직선 위에 놓이지 않는다. |
| 34 | +이어지는 m 개의 입력 줄에는 각각 i번째 차례에 해당 플레이어가 선택한 두 점의 번호가 주어진다 (1 ≤ i ≤ m). |
| 35 | +
|
| 36 | +출력 |
| 37 | +출력은 표준출력을 사용한다. 입력으로 주어진 케이스에 대해, |
| 38 | +m 번째 차례까지 게임을 진행한 상황에서 이미 게임이 종료되었다면 사이클이 처음으로 만들어진 |
| 39 | +차례의 번호를 양의 정수로 출력하고, m 번의 차례를 모두 처리한 이후에도 종료되지 않았다면 0을 출력한다. |
| 40 | +``` |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +유니온 파인드를 알고 있다면 매우 매우 쉬운 문제. |
| 45 | + |
| 46 | +문제를 간단하게 요약하면, |
| 47 | + |
| 48 | +N 명의 선수가 선분을 m 차례 번갈아가면서 그리는데 |
| 49 | + |
| 50 | +도중에 사이클이 발생한다면, 몇 번째에 사이클이 발생했는지 출력하고 |
| 51 | + |
| 52 | +사이클이 발생하지 않는다면 0 을 출력하면 된다. |
| 53 | + |
| 54 | +선분을 그린다는 것은 두 개의 원소를 하나의 부분 집합으로 만든다는 의미이다. |
| 55 | + |
| 56 | +즉, union |
| 57 | + |
| 58 | +사이클이 발생하는지 여부는 |
| 59 | + |
| 60 | +i 번째 차례에서 a-b 를 이어 선분을 그린다고 가정하면 |
| 61 | + |
| 62 | +a 와 b 의 parent 가 동일한 지 체크해주면 된다. |
| 63 | + |
| 64 | +아래 그림을 보면 조금 더 이해가 쉬울 것 같다. |
| 65 | + |
| 66 | + |
| 67 | + |
| 68 | +이번에는 사이클이 생기는 경우에 대한 그림이다. |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +유니온 파인드를 구현할 수 있는지 아닌지를 물어보는 아주 기본적인 문제이다! |
| 73 | + |
| 74 | +보통 유니온 파인드 알고리즘이 메인으로 나오지는 않고, |
| 75 | + |
| 76 | +다른 알고리즘에 섞여서 나오거나 |
| 77 | + |
| 78 | +유니온 파인드 연산을 조금 독특하게 변형해서 풀어야하게끔 출제되는 것 같다. |
| 79 | + |
| 80 | +이 문제를 통해 유니온 파인드에 대해서 익혀보고, |
| 81 | + |
| 82 | +가져올 유니온 파인드를 변형해서 사용해야 하는 어려운 문제를 같이 풀어보도록 하자 🔥 |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | + |
| 87 | + |
0 commit comments