Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 최소 스패닝 트리
  • 세그먼트 트리
  • 트라이
  • C++
  • UC++
  • 분할정복
  • KMP
  • SCC
  • 우선순위큐
  • 누적합
  • 정수론
  • 기하
  • 이분탐색
  • 유니온 파인드
  • 정렬
  • 수학
  • 문자열
  • 조합론
  • LCA
  • 큐
  • 투포인터
  • 스택
  • 구현
  • 브루트포스
  • 위상 정렬
  • 백트래킹
  • 백준
  • 트리
  • 그래프
  • 동적계획법

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 20040번 문제
공부 및 정리/백준 코드

[C++]백준 - 20040번 문제

2021. 10. 24. 16:31

20040번: 사이클 게임 (acmicpc.net)

 

20040번: 사이클 게임

사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한

www.acmicpc.net

 

20040번 : 사이클 게임


사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한 번호가 부여된 평면 상의 점 n 개가 주어지며, 이 중 어느 세 점도 일직선 위에 놓이지 않는다. 매 차례 마다 플레이어는 두 점을 선택해서 이를 연결하는 선분을 긋는데, 이전에 그린 선분을 다시 그을 수는 없지만 이미 그린 다른 선분과 교차하는 것은 가능하다. 게임을 진행하다가 처음으로 사이클을 완성하는 순간 게임이 종료된다. 사이클 C는 플레이어가 그린 선분들의 부분집합으로, 다음 조건을 만족한다.

C에 속한 임의의 선분의 한 끝점에서 출발하여 모든 선분을 한 번씩만 지나서 출발점으로 되돌아올 수 있다.

문제는 선분을 여러 개 그리다 보면 사이클이 완성 되었는지의 여부를 판단하기 어려워 이미 사이클이 완성되었음에도 불구하고 게임을 계속 진행하게 될 수 있다는 것이다. 이 문제를 해결하기 위해서 게임의 진행 상황이 주어지면 몇 번째 차례에서 사이클이 완성되었는지, 혹은 아직 게임이 진행 중인지를 판단하는 프로그램을 작성하려 한다.

입력으로 점의 개수 n과 m 번째 차례까지의 게임 진행 상황이 주어지면 사이클이 완성 되었는지를 판단하고, 완성되었다면 몇 번째 차례에서 처음으로 사이클이 완성된 것인지를 출력하는 프로그램을 작성하시오.

 

입력


입력은 표준입력을 사용한다. 입력의 첫 번째 줄에는 점의 개수를 나타내는 정수 3 ≤ n ≤ 500,000 과 진행된 차례의 수를 나타내는 정수 3 ≤ m ≤ 1,000,000 이 주어진다. 게임에서 사용하는 n개의 점에는 0 부터 n − 1 까지 고유한 번호가 부여되어 있으며, 이 중 어느 세 점도 일직선 위에 놓이지 않는다. 이어지는 m 개의 입력 줄에는 각각 i번째 차례에 해당 플레이어가 선택한 두 점의 번호가 주어진다 (1 ≤ i ≤ m).

 

 

출력


출력은 표준출력을 사용한다. 입력으로 주어진 케이스에 대해, m 번째 차례까지 게임을 진행한 상황에서 이미 게임이 종료되었다면 사이클이 처음으로 만들어진 차례의 번호를 양의 정수로 출력하고, m 번의 차례를 모두 처리한 이후에도 종료되지 않았다면 0을 출력한다.

 

 

 


 

생각해 볼 점


유니온 파인드를 이해하고 있다면 금방 풀 수 있는 문제입니다.

 

[Algorithm] 유니온 파인드(Union - Find) (tistory.com)

 

[Algorithm] 유니온 파인드(Union - Find)

유니온 파인드 알고리즘이란? 그래프 알고리즘의 일종으로서 상호 배타적 집합, Disjoint-set 이라고도 합니다. 여러 노드가 존재할 때 어떤 두 개의 노드를 같은 집합으로 묶어주고, 다시 어떤 두

ssungkang.tistory.com

 

코드


#include <iostream>
using namespace std;

//parents를 구함
int get_parent(int parents[], int target)
{
    if(parents[target] == target) return target;
    return parents[target] = get_parent(parents, parents[target]);
}

//유니온 파인드
bool set_union(int parents[], int a, int b)
{
    a = get_parent(parents, a);
    b = get_parent(parents, b);
    
    if(a == b) return false;
    parents[b] = a;
    return true;
}

int main() 
{
	int N, M;
	scanf("%d %d", &N, &M);
	
	int *parents = new int[N];
	for(int i = 0; i < N; i++) parents[i] = i;
	
	bool is_ended = false;
	for(int i = 1; i <= M; i++)
	{
	    int a, b;
	    scanf("%d %d", &a, &b);
	    
	    if(!set_union(parents, a, b)) 
	    {
	        printf("%d", i);
	        is_ended = true;
	        break;
	    }
	}
	if(!is_ended) printf("0");
	return 0;
}

 

그 외


 

저작자표시

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 1197번 문제  (0) 2021.10.25
[C++]백준 - 11780번 문제  (0) 2021.10.25
[C++]백준 - 1100번 문제  (0) 2021.10.24
[C++]백준 - 1026번 문제  (0) 2021.10.23
[C++]백준 - 11779번 문제  (0) 2021.10.23
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 1197번 문제
    • [C++]백준 - 11780번 문제
    • [C++]백준 - 1100번 문제
    • [C++]백준 - 1026번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바