반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 에라스토테네스의 체
- BOJ
- 프로그래머스
- 가상메모리
- 투포인터
- level3
- level1
- level2
- DP
- BFS
- 다이나믹 프로그래밍
- N과M
- python
- 운영체제
- 스택
- 딕셔너리
- 브루트포스
- 가상메모리 관리
- 백준
- 코딩테스트
- 재귀
- programmers
- 수학
- 힙
- 구현
- 파이썬
- dfs
- MYSQL
- 그리디
- 다익스트라
Archives
- Today
- Total
동캄의 코딩도장
백준 14595 [동방 프로젝트(Large)] 파이썬 본문
반응형
https://www.acmicpc.net/problem/14595
# 백준 14595 동방 프로젝트 (Large)
# 문제 요약:
# N개의 방이 일렬로 있고, M번의 공격이 발생한다.
# 공격은 x~y 구간의 벽을 무너뜨려 연결하는 방식으로 이루어진다.
# 최종적으로 남은 "구분된 방의 개수"를 출력하는 문제.
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N = int(input()) # 방의 개수
M = int(input()) # 공격 횟수
# parent[i] : i번 방이 속한 그룹(대표 방 번호)을 저장
parent = [i for i in range(N+1)]
# Find 함수 (경로 압축)
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
# Union 함수 (x~y 범위를 하나의 집합으로 합침)
def union(a, b):
a = find(a)
b = find(b)
# a가 b보다 작은 동안, 즉 [a, b] 구간을 전부 합침
while a < b:
parent[a] = b # a의 대표를 b로 갱신
a = find(a+1) # 다음 방으로 넘어가며 병합 진행
# M번 공격 실행
for _ in range(M):
x, y = map(int, input().split())
union(x, y)
# 최종적으로 parent[i] == i 인 경우는 "대표 방"
# 즉, 독립된 구역(방의 묶음)이 하나 있는 것
ans = 0
for i in range(1, N+1):
if parent[i] == i:
ans += 1
print(ans) # 남은 방의 개수 출력
UNION-FIND를 이용하되, 경로를 압축한다.
반응형
'코테 > BOJ' 카테고리의 다른 글
| 백준 16398 [행성 연결] 파이썬 (0) | 2025.08.21 |
|---|---|
| 백준 17619 [개구리 점프] 파이썬 (0) | 2025.08.21 |
| 백준 18116 [로봇 조립] 파이썬 (0) | 2025.08.20 |
| 백준 1976 [여행 가자] 파이썬 (0) | 2025.08.20 |
| 백준 7511 [소셜 네트워킹 어플리케이션] 파이썬 (0) | 2025.08.20 |