-
[BOJ/python]1765번 닭싸움 팀 정하기알고리즘/BOJ 2022. 7. 3. 00:00
백준 1765번 닭싸움 팀 정하기 파이썬
문제 링크 - https://www.acmicpc.net/problem/1765
union-find 문제는 해당 카테고리의 문제라는 것을 알고 있다면 쉽게 풀 수 있다. 하지만 문제를 보고 union-find로 풀어야겠다는 아이디어를 떠올리는 것은 어려울 수 있다. 팀을 만들어야 되는 문제이고 팀의 개수를 물어보았기 때문에 union-find로 풀면 될 것 같았다.
1. 풀이
- 팀을 만들기 위해 친구는 입력값을 받을 때 모두 union 한다.
- 원수인 경우 인접 리스트를 통해 서로 원수 관계인 것을 표현한다.
- 모든 학생을 탐색하며 원수 배열의 길이가 2 이상인 경우 해당 배열에 있는 학생들을 union해서 팀으로 만들어준다.
2. 코드
#닭싸움 팀 정하기union find def find(u): if p[u] <0 : return u p[u] = find(p[u]) return p[u] def union(u,v) : u=find(u) v=find(v) if u==v : return if abs(p[u]) >= abs(p[v]): p[u]+=p[v] p[v]=u else: p[v]+=p[u] p[u]=v N= int(input()) p = [-1 for _ in range(N+1)] e = [[] for _ in range(N+1)] M = int(input()) for i in range(M): r, a, b = input().split() a,b = int(a), int(b) if r=='F' : union(a,b) else: e[a].append(b) e[b].append(a) for i in range(1, N+1): #각 학생들의 원수 배열을 탐색하며, 원수가 2명 이상이면 그 원수끼리 모두 팀으로 만들기 if len(e[i]) > 1: for j in range(1, len(e[i])): union(e[i][j-1], e[i][j]) sol=0 for i in range(1, N+1): if p[i]<0: sol+=1 print(sol)
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ/python]1092번 배 (0) 2022.07.04 [BOJ/python]10775번 공항 (0) 2022.07.04 [BOJ/python] 6987번 월드컵 (0) 2022.07.01 [BOJ/python] 2412번 암벽 등반 (0) 2022.07.01 [BOJ/python] 2982번 국왕의 방문 (0) 2022.06.30