[파이썬] 백준 15809 : 전국시대 (골드4)
풀이
방향성 생각
- 유니온 파인드 + 조건문
전체코드
import sys
input = lambda : sys.stdin.readline().rstrip()
N,M = map(int,input().split())
# 입력 받기
arr = [0]
for _ in range(N):
arr.append(int(input()))
# 부모 관리
P = [i for i in range(N+1)]
def find(x):
if P[x] != x:
P[x] = find(P[x])
return P[x]
# 입력 쿼리
for _ in range(M):
cmd,a,b = map(int,input().split())
pa,pb = find(a),find(b)
# 부모가 다른 경우에 연산 진행
if pa != pb:
# 동맹 : 루트가 작은 쪽으로 설정
if cmd == 1:
P[max(pa,pb)] = min(pa,pb)
arr[min(pa,pb)] += arr[max(pa,pb)]
arr[max(pa,pb)] = 0
# 전쟁 : 전쟁에서 승리한 쪽으로 설정
elif cmd == 2:
ka,kb = arr[pa],arr[pb]
if ka>=kb:
P[pb] = pa
arr[pa],arr[pb] = ka-kb,0
else:
P[pa] = pb
arr[pa],arr[pb] = 0,kb-ka
answer = [a for a in arr if a>0]
print(len(answer))
print(*sorted(answer))
코멘트
- 입력 인덱스 1씩 빼서 0~N-1로 관리하면 좋을듯?
- 전쟁 유무도 T/F형태로 받을 수 있어서 좀 더 직관적으로 짤 수 있을듯
- 부모 + 인구관리를 따로 해줘야해서, 기존 유니온파인드 쉬운 문제보다는 실수할거리가 있는 문제.
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 2917 : 늑대사냥꾼 (골드2) (0) | 2025.01.11 |
---|---|
[파이썬] 백준 1726 : 로봇 (골드3) (0) | 2025.01.10 |
[파이썬] 백준 2211 : 네트워크 복구 (골드2) (0) | 2025.01.09 |
[파이썬] 백준 1956 : 운동 (골드4) (0) | 2025.01.05 |
[파이썬] 백준 1238 : 파티 (골드3) (0) | 2025.01.04 |
[파이썬] 백준 13911 : 집 구하기 (골드2) (0) | 2025.01.03 |
[파이썬] 백준 16398 : 행성 연결 (골드4) (0) | 2025.01.02 |
댓글