Skip to content

Commit c5400e3

Browse files
committed
feat: 4월 2주차 발제 자료 업로드
1 parent 35bf3d2 commit c5400e3

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'''
2+
BOJ #1717. 집합의 표현 (골드5)
3+
https://www.acmicpc.net/problem/1717
4+
유형: Union-Find, Graph
5+
'''
6+
7+
import sys
8+
sys.setrecursionlimit(10 ** 6) # 재귀 깊이 제한 늘리기
9+
input = sys.stdin.readline
10+
11+
# Union 연산(두 집합을 합치기 위한 함수)
12+
def union(a, b):
13+
p_a = find(a)
14+
p_b = find(b)
15+
16+
if p_a > p_b: # 값이 더 작은 쪽을 부모로 설정
17+
parent[p_a] = p_b
18+
else:
19+
parent[p_b] = p_a
20+
21+
# Find 연산(같은 집합에 속하는지 확인하기 위한 함수)
22+
def find(a):
23+
if a != parent[a]:
24+
parent[a] = find(parent[a]) # 경로 압축
25+
return parent[a]
26+
27+
# 연산 수행
28+
n, m = map(int, input().split())
29+
parent = [i for i in range(n + 1)] # 초기: 각 원소가 자기 자신을 부모로 가짐
30+
31+
for _ in range(m):
32+
flag, a, b = map(int, input().split())
33+
if flag == 0: # 합집합 연산
34+
union(a, b)
35+
else: # 같은 집합 확인 연산
36+
if find(a) == find(b):
37+
print("YES")
38+
else:
39+
print("NO")
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
## 🚀4월 2주차 (4/14) 스터디 발제 주제: Graph (Backgracking)
2+
> 발제자: 김민정 (@Mingguriguri)
3+
4+
> [!NOTE]
5+
> 주제: Graph (Backgracking)
6+
7+
### 🗂️ 스터디 자료
8+
- PDF: [바로가기
9+
](Study_BOJ_1759.pdf)
10+
11+
<img width="500" alt="스터디문제" src="https://github.com/user-attachments/assets/80d0415b-034e-484e-849f-34457b8c543b" />
12+
<img width="500" alt="발제문제" src="https://github.com/user-attachments/assets/e7136d73-179c-4540-8380-88181c5c3fd7" />
13+
14+
15+
### 📖 문제
16+
- [백준 #1759. 암호만들기](https://www.acmicpc.net/problem/1759): Graph (Backgracking) / 골드1
17+
- 정답 코드: [Study_BOJ_1759_암호만들기.py](Study_BOJ_1759_암호만들기.py)
18+
19+
### 💻 과제
20+
- [백준 #6603. 로또](https://www.acmicpc.net/problem/6603): Graph (Backgracking) / 실버2
21+
- 정답 코드: [Assignment_BOJ_6603_로또.py](Assignment_BOJ_6603_로또.py)
604 KB
Binary file not shown.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
'''
2+
BOJ #1976. 여행 가자 (골드4)
3+
https://www.acmicpc.net/problem/1976
4+
유형: Union-Find, Graph
5+
'''
6+
import sys
7+
sys.setrecursionlimit(10 ** 8)
8+
input = sys.stdin.readline
9+
10+
def union(a, b):
11+
p_a = find(a)
12+
p_b = find(b)
13+
14+
if p_a > p_b: # a의 대표보다 b의 대표가 더 작은 값을 가지면,
15+
parent[p_a] = p_b # a가 속한 집합을 b의 집합에 합치기
16+
else:
17+
parent[p_b] = p_a # 그렇지 않으면 b의 집합을 a의 집합에 합치기
18+
19+
def find(a):
20+
if a == parent[a]: # a가 자기 자신의 부모이면 대표 노드
21+
return a
22+
23+
parent[a] = find(parent[a]) # 경로 압축을 통해 a의 부모를 대표 노드로 재설정
24+
return parent[a]
25+
26+
# 도시의 개수 n과 여행 계획에 포함된 도시의 수 m을 입력받기
27+
n = int(input())
28+
m = int(input())
29+
30+
parent = [i for i in range(n)] # 각 도시는 처음에 자기 자신이 대표 노드.
31+
32+
# n개의 줄에 걸쳐 도시 간 연결 정보를 입력받고, 연결되어 있으면 union 연산 수행
33+
for i in range(n):
34+
arr = list(map(int, input().split()))
35+
for j in range(n):
36+
if arr[j]: # 1이면 i와 j가 연결되어 있으므로 union 연산 수행
37+
union(i, j)
38+
39+
# 여행 계획을 입력받는다.
40+
plan = list(map(int, input().split()))
41+
result = "YES"
42+
# 여행 계획에 있는 모든 도시가 같은 집합(대표 노드)을 가지는지 확인
43+
for i in range(1, m):
44+
if parent[plan[i]-1] != parent[plan[0]-1]:
45+
result = "NO"
46+
break
47+
48+
print(result)

0 commit comments

Comments
 (0)