-
백준 1717_ Python알고리즘/백준(BOJ) 2021. 4. 12. 20:07반응형
https://www.acmicpc.net/problem/1717
문제
초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a와 b는 n 이하의 자연수 또는 0이며 같을 수도 있다.
출력
1로 시작하는 입력에 대해서 한 줄에 하나씩 YES/NO로 결과를 출력한다. (yes/no 를 출력해도 된다)
접근법
- union 기법을 사용해서 문제에 접근을 하게된다.
- 첫번째 기법은 union 하는 함수를 만드는 건데, merge()로 이름붙여 함수를 구현하였다. merge(a,b)를 받게된다면, parent[b]=a 로 함으로써, b의 부모를 a로 만들어준다
- 두번째 함수는 find 함수로써 parent[a]!= a 일시 , parent[a] = find(parent[a]) 를 반복해줌으로써, 최상위 부모를 찾아주는 함수이다.
import sys n, m = map(int, sys.stdin.readline().split()) parent = list([i for i in range(0,n+1)]) def find(a): if parent[a] != a: parent[a] = find(parent[a]) return parent[a] def merge(a,b): a = find(a) b = find(b) parent[b] = a return for i in range(m): a,b,c = map(int, sys.stdin.readline().split()) if a ==0: merge(b,c) else: if find(b) = find(c): print("YES") else: print("NO")
반응형'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
백준 7785 _ Python (1) 2021.04.13 백준 11279_Python (0) 2021.04.12 백준 3015_Python (0) 2021.04.12 백준 6549_Python (0) 2021.04.12 백준 9935 _Python (0) 2021.04.12