2653번: 안정된 집단
어떤 심리학자는 학교의 학급이나 회사의 부서와 같이 여러 사람들이 모인 집단이 어떤 경우에 안정되어 있는지를 연구하였다. 심리학자는 집단에 속한 모든 사람들이 서로 좋아하거나 혹은 그
www.acmicpc.net
그래프에서 서로 다른 집단을 찾고 그 집단에 속한 모든 노드들을 출력하면 되는 문제다. 해결법은 다음과 같다.
1. 방문 안한 노드를 찾고 거기에서 그 노드와 연결된 모든 노드를 찾는다.
ex. 1번 노드를 방문 안했고 1번 노드에 연결된 노드들은 2, 3, 4이다. -> (1, [2, 3, 4])
2. bfs에 1번에서 했던 작업의 결과로 나온 것을 넣어준다.
3. 전 단계에서 연결된 노드를 탐색하며 1번의 연결된 결과와 같은 꼴로 연결되어 있는지 확인한다.
4. 결과를 출력한다.
주의할 점은 다음과 같다.
1. 현재 자신과 연결된 없으면 0출력
2. 처음에 넣어준 연결된 노드와 값이 같지 않으면 0출력
import sys
from queue import Queue
arr = [[0 for col in range(101)] for row in range(101)]
visit = [0 for col in range(101)]
ans = []
def solution(x, n, love):
q = Queue()
q.put([x, love])
while not q.empty():
head = q.get()
headNode = head[0]
headLove = head[1]
visit[headNode] = x
for loveItem in headLove:
if not visit[loveItem]:
visit[loveItem] = x
temp = []
for i in range(1, n + 1):
if arr[loveItem][i] == 0:
temp.append(i)
if headLove != temp:
return False
q.put([loveItem, temp])
return True
if __name__ == "__main__":
cnt = 0
n = int(input())
for i in range(1, n + 1):
num = list(map(int, input().split()))
for j in range (0, len(num)):
arr[i][j + 1] = num[j]
for i in range(1, n + 1):
if visit[i] == 0:
love = []
for j in range(1, n + 1):
if arr[i][j] == 0:
love.append(j)
if len(love) == 1:
print(0)
sys.exit()
check = solution(i, n, love)
if not check:
print(0)
sys.exit()
else:
ans.append(love)
cnt += 1
print(cnt)
for ansItem in ans:
for num in ansItem:
print(num, end = ' ')
print()
'백준' 카테고리의 다른 글
백준12852 - 1로 만들기2 (0) | 2021.04.14 |
---|---|
프로그래머스-월간 코드 챌린지 시즌1-두 개 뽑아서 더하기 (0) | 2021.04.12 |
백준16922 - 로마 숫자 만들기 (0) | 2021.01.26 |
백준12904 - A와 B (0) | 2021.01.25 |
백준2685 - 님비합 (0) | 2020.08.25 |