728x90
반응형
https://www.acmicpc.net/problem/15809
15809번: 전국시대
첫 번째 줄에 국가의 수를 나타내는 N과 기록의 수 M이 주어진다. (1 ≤ N, M ≤ 100,000) 두 번째 줄 부터 N개의 줄에 걸쳐 i번째 국가의 병력 Ai (1 ≤ i ≤ N)가 자연수로 주어진다. (1 ≤ Ai ≤ 10,000) 다
www.acmicpc.net
<풀이>
Union-Find 알고리즘을 응용하여 풀 수 있는 문제다.
conturies에 각 국의 전투력 또는 점령국(속국의 경우)을 적어놓은다.
전투력과 헷갈릴 수 있으므로, 속국인 경우에 점령국의 Index를 -1 을 곱한 음수 값으로 저장한다.
따라서 점령국의 경우 전투력이 나오고, 속국인 경우에는 해당 점령국의 인덱스가 저장되는 것이다.
따라서, 전투를 하거나 동맹을 맺는 경우 속국으로 계산 하는 것이 아닌 점령국을 대상으로 계산을 진행하면 된다.
<전체 코드>
import sys
N, M = map(int, sys.stdin.readline().split())
conturies = [0]
for _ in range(N):
conturies.append(int(sys.stdin.readline()))
def find(n):
now = conturies[n]
if now < 0:
return find(-1*now)
else:
return n
for _ in range(M):
com, x, y = map(int, sys.stdin.readline().split())
find_x = find(x)
find_y = find(y)
if com == 1:
conturies[find_x] += conturies[find_y]
conturies[find_y] = -1*find_x
else:
if conturies[find_x] == conturies[find_y]:
conturies[find_x] = 0
conturies[find_y] = 0
elif conturies[find_x] > conturies[find_y]:
conturies[find_x] -= conturies[find_y]
conturies[find_y] = -1*find_x
else:
conturies[find_y] -= conturies[find_x]
conturies[find_x] = -1*find_y
answer = []
for i in conturies:
if i > 0:
answer.append(i)
answer.sort()
print(len(answer))
print(*answer)
728x90
반응형
'# Coding > # 백준' 카테고리의 다른 글
파이썬 입력 시간 줄이기 (0) | 2025.01.10 |
---|---|
[백준 / 2132] 나무 위의 벌레 - Python (0) | 2022.04.22 |
[백준 / 1167] 트리의 지름 - Python (0) | 2022.04.21 |
[백준 / 1967] 트리의 지름 - Python (0) | 2022.04.12 |
[백준 / 13913] 숨바꼭질 4 - Python (0) | 2022.04.07 |