일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 그리디
- 투포인터
- 우선순위큐
- GROUP BY
- 자료구조
- 트리
- 수학
- MST
- DFS
- join
- 플로이드-워셜
- 재귀
- 다익스트라
- 에라토스테네스의 체
- 다이나믹프로그래밍
- 브루트포스
- 구현
- 누적합
- 서브쿼리
- 백트래킹
- 다시
- 크루스칼
- DP
- 시뮬레이션
- 분할정복
- BFS
- 그래프 탐색
- 해시
- 다이나믹 프로그래밍
- 그래프 이론
- Today
- Total
기록하고 까먹지 말기
1976 본문
날짜 : 2023. 02. 22
사용 언어 : python
문제
코드
import sys
sys.setrecursionlimit(10**6)
n = int(sys.stdin.readline()) # 도시의 개수 (200 이하)
m = int(sys.stdin.readline()) # 여행 계획에 속한 도시의 개수 (1000 이하)
parent = [i for i in range(n+1)] # 각 노드별 부모 테이블
def find(node): # 노드의 부모 찾기
if node == parent[node]: # 해당 노드가 부모 노드면 리턴
return node
p = find(parent[node]) # 해당 노드에 대한 부모 찾기(거슬러 올라감)
parent[node] = p # 부모 노드 갱신
return parent[node] # 부모노드 리턴
def union(a, b): # a 집합과 b 집합 합치기
# 각 노드의 부모 찾기
a = find(a)
b = find(b)
if a == b: # 동일한 집합인 경우
return
if a < b: # a의 부모 < b의 부모 -> b의 부모가 a 부모 밑으로 들어감
parent[b] = a
else: # 반대
parent[a] = b
for i in range(1, n+1): # i 번째 도시
link = list(map(int, sys.stdin.readline().split())) # 연결정보 입력
for j in range(1, len(link) + 1): # 연결정보에 대해서 탐색
if link[j-1] == 1: # 연결되어 있다면
union(i, j) # 합치기
plan = list(map(int, sys.stdin.readline().split())) # 여행 계획
res = set([find(i) for i in plan])
if len(res) != 1: print('NO')
else: print('YES')
풀이
- 분리집합을 이용해 각 노드별 parent를 기록하고, 노드끼리의 parent를 비교하면서 최신화한다.
- 또한 for문을 이용한 연결정보를 탐색하면서 집합이 연결되었다면 union을 이용해 합침으로써 parent 테이블을 최신화한다.
- 마지막에는 여행계획을 입력받고 각 계획마다의 parent를 탐색, 값이 1인 경우(서로 같은 집합) yes, 아니라면 no를 출력한다.
알게된 점
- 각 노드별로 연결정보를 전부 입력받고 반복문을 통해 연결정보를 계속 최신화하는 방식으로 코드를 짜려고 했지만 너무 비효율적이었다.
- 그래서 하단 알고리즘 분류르 참고, 분리집합이라는 알고리즘을 활용한 문제라는 것을 알게 되었다.
- 구글링한 결과 해당 알고리즘을 공부할 수 있었고 이를 활용해 문제를 해결했다.
참고 사이트
- https://deep-learning-study.tistory.com/590
[백준 파이썬] 1976번 여행가자
1976번 여행가자 www.acmicpc.net/problem/1976 1976번: 여행 가자 동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의
deep-learning-study.tistory.com
- https://blog.naver.com/ndb796/221230967614
17. Union-Find(합집합 찾기)
Union-Find(유니온-파인드)는 대표적인 그래프 알고리즘입니다. 바로 '합집합 찾기'라는 의미를 ...
blog.naver.com