DevYoon
[λ°±μ€] 1043. κ±°μ§λ§ (Python) λ³Έλ¬Έ
link π https://www.acmicpc.net/problem/1043
β μ£Όλͺ©ν μ
βοΈ μ§μ€μ μκ² λ μ¬λκ³Ό κ°μ νν°μ κ°λ©΄ μ§μ€μ μκ² λλ€
βοΈ 1μ΄ μ§μ€μ μκ³ μλ μ¬λμ΄κ³ , 1κ³Ό 4κ° κ°μ νν°μ κ° κ²½μ°, 4κ° μ°Έμ¬ν λͺ¨λ νν°κ° κ±°μ§λ§μ ν μ μλ νν°κ° λλ€.
1οΈβ£ 3% λμμ μ€λ΅λ μ½λ
import sys
input = sys.stdin.readline
def knowTruth(y):
for idx in range(1, len(party[y])):
check[party[y][idx]] = 1 # μ§μ€μ μκ³ μμΌλ―λ‘ μ²΄ν¬
N, M = map(int, input().split()) # μ¬λμ μ, νν°μ μ
truth = list(map(int, input().split())) # μ§μ€μ μκ³ μλ μ¬λμ μ + λ²νΈ
truthNum = truth.pop(0) # μ§μ€μ μκ³ μλ μ¬λμ μ
check = [0] * (N+1) # μ§μ€μ μκ³ μλμ§ μ²΄ν¬
party = [0]*M # νν°
res = 0
for t in truth: # μ΅μ΄μ μ§μ€μ μκ³ μλ μ¬λ 체ν¬
check[t] = 1
for idx in range(M):
party[idx] = list(map(int, input().split()))
for y in range(M):
for x in range(1, len(party[y])):
if check[party[y][x]]:
knowTruth(y) # μ§μ€μ μλ μ¬λμ΄ μ°Έκ°ν νν° => μ°Έμ¬μ λͺ¨λκ° μ§μ€μ μκ² λ¨
for y in range(M-1, -1, -1):
for x in range(1, len(party[y])):
if check[party[y][x]]:
knowTruth(y) # μ§μ€μ μλ μ¬λμ΄ μ°Έκ°ν νν° => μ°Έμ¬μ λͺ¨λκ° μ§μ€μ μκ² λ¨
for y in range(M):
temp = 0
for x in range(1, len(party[y])):
temp += check[party[y][x]] # μ§μ€μ μκ³ μμΌλ©΄ +1
if temp == 0: # tempκ° 0μ΄λ©΄ μ§μ€μ μλ μ¬λμ΄ μλ€λ λ»
res += 1 # κ±°μ§λ§ ν μ μλ νν° +1
print(res)
- μ€κ°μ μ§μ€μ μκ² λ κ²½μ°, ν΄λΉ μ¬λμ΄ ν¬ν¨λ λͺ¨λ νν°λ₯Ό κ±°μ§λ§ ν μ μλ νν°λ‘ 체ν¬ν΄μΌ νλ€.
- κ·Έλ¬λ μ μ½λλ‘λ νν° λ¦¬μ€νΈλ₯Ό μμμλΆν° ν λ², λ€μμλΆν° ν λ² λ± 2λ² μ²΄ν¬νλ―λ‘ μΆ©λΆν λͺ¨λ κ²½μ°λ₯Ό 체ν¬νμ§ λͺ»νλ€.
2οΈβ£ ν΅κ³Όν μ½λ
import sys
input = sys.stdin.readline
N, M = map(int, input().split()) # μ¬λμ μ, νν°μ μ
truth = list(map(int, input().split()))[1:] # μ§μ€μ μκ³ μλ μ¬λλ€μ λ²νΈ 리μ€νΈ
check = [0] * (N+1) # μ§μ€μ μκ³ μλμ§ μ²΄ν¬
party = [0]*M
party_check = [1]*M # κ±°μ§λ§ ν μ μλ νν°μΈμ§ 체ν¬
for t in truth: # μ΅μ΄μ μ§μ€μ μκ³ μλ μ¬λ 체ν¬
check[t] = 1
for idx in range(M):
party[idx] = list(map(int, input().split()))[1:] # νν° μμλλ‘ μ
λ ₯
while truth:
truth_person = truth.pop()
dontKnow = set() # μ§μ€μ μμ§ λͺ¨λ₯΄λ μ¬λλ€
for idx in range(M):
if truth_person in party[idx]: # νν°μ μ§μ€μ μκ³ μλ μ¬λμ΄ μμΌλ©΄
party_check[idx] = 0 # κ±°μ§λ§ ν μ μμΌλ―λ‘ μ²΄ν¬ ν΄μ
dontKnow = dontKnow.union(party[idx]) # μ§μ€μ μμ§ λͺ¨λ₯΄λ μ¬λλ€μ νν°μλ€ μΆκ°
for person in dontKnow:
if not check[person]: # μμ§ μ§μ€μ λͺ¨λ₯΄λ©΄
truth.append(person) # μ§μ€μ μκ² λμμΌλ―λ‘ truth 리μ€νΈμ μΆκ°
check[person] = 1 # 체ν¬
print(sum(party_check))
- ꡬκΈλ§ν΄λ³Έ κ²°κ³Ό, μ§μ€μ μκ² λ λλ§λ€ κ·Έ μ¬λμ λ²νΈλ₯Ό truth 리μ€νΈμ λ΄μμ£Όμκ³ , whileλ¬Έμ ν΅ν΄ λͺ¨λ κ²½μ°λ₯Ό 체ν¬ν΄μ£Όμλ€.
- party_check 리μ€νΈμ λͺ¨λ νν°λ₯Ό κ±°μ§λ§ν μ μλ κ²(1)λ‘ μ²΄ν¬ν΄λκ³ , κ±°μ§λ§ ν μ μλ€κ³ λ°νμ§λ μκ° 0μΌλ‘ κ°μ λ°κΏμ£Όμλ€.
- λ§μ§λ§μ party_check 리μ€νΈμ ν©μ ꡬνλ©΄ κ±°μ§λ§ν μ μλ νν°μ κ°―μκ° λμ¨λ€.