https://www.acmicpc.net/problem/1043

๋ฌธ์ œ

์ง€๋ฏผ์ด๋Š” ํŒŒํ‹ฐ์— ๊ฐ€์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ํŒŒํ‹ฐ์— ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ์ง€๋ฏผ์ด๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•  ๋•Œ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง„์‹ค๋กœ ๋งํ•˜๊ฑฐ๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ ๊ณผ์žฅํ•ด์„œ ๋งํ•œ๋‹ค. ๋‹น์—ฐํžˆ ๊ณผ์žฅํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์žฌ๋ฏธ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋˜๋„๋ก์ด๋ฉด ๊ณผ์žฅํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ง€๋ฏผ์ด๋Š” ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€๊ธฐ๋Š” ์‹ซ์–ดํ•œ๋‹ค. ๋ฌธ์ œ๋Š” ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์‚ฌ๋žŒ๋“ค์ด ํŒŒํ‹ฐ์— ์™”์„ ๋•Œ๋Š”, ์ง€๋ฏผ์ด๋Š” ์ง„์‹ค์„ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋‹น์—ฐํžˆ, ์–ด๋–ค ์‚ฌ๋žŒ์ด ์–ด๋–ค ํŒŒํ‹ฐ์—์„œ๋Š” ์ง„์‹ค์„ ๋“ฃ๊ณ , ๋˜๋‹ค๋ฅธ ํŒŒํ‹ฐ์—์„œ๋Š” ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ์„ ๋•Œ๋„ ์ง€๋ฏผ์ด๋Š” ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€๊ฒŒ ๋œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ์ด๋Ÿฐ ์ผ์„ ๋ชจ๋‘ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ๋žŒ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํŒŒํ‹ฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋ฏผ์ด๋Š” ๋ชจ๋“  ํŒŒํ‹ฐ์— ์ฐธ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, ์ง€๋ฏผ์ด๊ฐ€ ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์œผ๋ฉด์„œ, ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๋žŒ์˜ ์ˆ˜ N๊ณผ ํŒŒํ‹ฐ์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ด์•ผ๊ธฐ์˜ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์™€ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๊ฐ€ ๋จผ์ € ์ฃผ์–ด์ง€๊ณ  ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์™€ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

N, M์€ 50 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๊ณ , ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋Š” 0 ์ด์ƒ 50 ์ดํ•˜์˜ ์ •์ˆ˜, ๊ฐ ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋Š” 1 ์ด์ƒ 50 ์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ

์กฐ๊ฑด

  • ์‹œ๊ฐ„ ์ œํ•œ: 2์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 128MB

๐Ÿ”” ๋ณธ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € Union Find์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป Union Find?

  • Union: ๋…ธ๋“œ๋“ค์„ ํ•ฉ์น˜๊ณ 
  • Find: ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„
  • Disjoint Set: ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(=๋ถ„๋ฆฌ ์ง‘ํ•ฉ)์„ ์ฐพ์•„๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š”,

1. ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ find(x) ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœํ•œ๋‹ค.

2. union(a,b) ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‘ ์›์†Œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ , ๋‘˜ ์ค‘ ๋” ํฐ ๋ฒˆํ˜ธ๋ฅผ ์ž‘์€ ๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

3. ๊ฐ ๋…ธ๋“œ๋ณ„ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ, ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค.

๋ผ๋Š” ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•ด์•ผํ•œ๋‹ค!

๐Ÿ” Union Find๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

  • ๋งŒ์•ฝ์— A์™€ B, B์™€ C๊ฐ€ ์นœ๊ตฌ๊ด€๊ณ„๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ A์™€ C๋„ ์นœ๊ตฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ๋‘ ์ง‘๋‹จ์€ B๋ผ๋Š” ์‚ฌ๋žŒ์„ ํ†ตํ•ด์„œ ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์ด ๋œ๋‹ค!
  • ์ด๋ฒˆ์—๋Š” A์™€ B, C์™€ D๊ฐ€ ์นœ๊ตฌ๊ด€๊ณ„๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ˜„์žฌ๋Š” ๋‘ ๊ทธ๋ฃน ๋ชจ๋‘ ์†ํ•œ ์‚ฌ๋žŒ์ด ์—†๊ธฐ์—, ์„œ๋กœ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ๊ทธ๋ฃน์ด ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ›„์— B์™€ D๊ฐ€ ์นœ๊ตฌ๋ฅผ ๋งบ๊ฒŒ ๋œ๋‹ค๋ฉด, ๋‘ ๊ทธ๋ฃน์ด ์—ฐ๊ฒฐ๋˜์–ด ๊ฒฐ๊ตญ A,B,C,D๋Š” ๋ชจ๋‘ ํ•œ ๊ทธ๋ฃน์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ด๋ ‡๋“ฏ ํ›„์— ๋ฐœ์ƒ๋˜๋Š” ์ƒˆ๋กœ์šด ๊ด€๊ณ„๋“ค๋กœ ์ธํ•ด์„œ ์–ธ์ œ๋“ ์ง€ ๊ทธ๋ฃน์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ์—, Union Find๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„์„ฑ์„ ๊ณ„์†ํ•ด์„œ ์ •์˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค!

์ฝ”๋“œ

import sys
input = sys.stdin.readline

N,M = map(int,input().split())
truth_person = list(map(int,input().split()))[1:]

Know_Truth = 0 
parent = [i for i in range(N+1)] # ๋ถ€๋ชจ ๋…ธ๋“œ ํ…Œ์ด๋ธ”
for person in truth_person:      # ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ 0์œผ๋กœ ์„ค์ •
    parent[person] = Know_Truth
    
# Union Find
def find(x):
    if parent[x] != x:  # ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€
        parent[x] = find(parent[x]) 
    return parent[x]

def union(a,b):
    # ๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์คŒ
    a = find(a)
    b = find(b)
    # ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ์ˆซ์ž์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ
    if a < b:
        parent[b] = a
    else:
        parent[a] = b
  
# ํŒŒํ‹ฐ์— ์ฐธ์„ํ•œ ์‚ฌ๋žŒ๋“ค์„ 2๋ช…์”ฉ unionํ•˜๋Š” ๊ณผ์ •
parties = []
for _ in range(M):
    party = list(map(int,input().split()))[1:]
    for i in range(len(party)-1):
        union(party[i],party[i+1])
    parties.append(party)
    
# ๊ฐ ํŒŒํ‹ฐ๋ณ„๋กœ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์„ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ
cnt = 0
for party in parties:
    Know = False
    for person in party:
        # ์ง„์‹ค์„ ์•„๋Š” ๊ทธ๋ฃน์— ์†ํ•ด ์žˆ๋Š” ๊ฒฝ์šฐ (= ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ 0)
        if find(person) == Know_Truth:
            Know = True
            break
    if not Know:
        cnt += 1

print(cnt)
  1. ์ด ๋ฌธ์ œ์—์„œ๋Š”, ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด ํŒ๋ณ„ํ•œ๋‹ค.
  1. find ํ•จ์ˆ˜๋Š” ๋ณธ์ธ์ด ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ, ๊ณ„์†ํ•ด์„œ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์žฌ๊ท€ ํ˜ธ์ถœํ•œ๋‹ค.
  1. union ํ•จ์ˆ˜๋Š” ๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•˜์—ฌ, ๋” ์ž‘์€ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ ๊ทธ๋ฃน ๋‚ด์—์„œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์ด ๋ชจ๋‘ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  1. ๊ฐ ํŒŒํ‹ฐ๋ณ„๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๋‘ ์‚ฌ๋žŒ์”ฉ union ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ, ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  1. ๊ฐ ํŒŒํ‹ฐ๋“ค์„ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋ฉฐ, ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์†ํ•ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์ฆ‰, ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ 0์ธ ์‚ฌ๋žŒ์ด ๊ทธ๋ฃน ๋‚ด์— ์†ํ•ด ์žˆ์œผ๋ฉด ๊ทธ ์•ˆ์—์„œ๋Š” ์ง„์‹ค๋งŒ์„ ๋งํ•  ์ˆ˜ ๋ฐ–์— ์—†์œผ๋ฏ€๋กœ ์นด์šดํŠธํ•  ์ˆ˜ ์—†๋‹ค.

  • ๋งŒ์•ฝ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์—†๋Š” ๊ทธ๋ฃน์ด๋ผ๋ฉด, ๊ฑฐ์ง“๋ง์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ์— cnt += 1์„ ํ•ด์ค€๋‹ค.


๋А๋‚€ ์  & ๋ฐฐ์šด ์ 

  1. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ผ๋Š” ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์ตํ•œ ์‹œ๊ฐ„์ด์—ˆ๋‹ค! ์ฒ˜์Œ์—๋Š” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๊ฝค๋‚˜ ์–ด๋ ค์› ๋Š”๋ฐ.. ํ•˜๊ณ  ๋‚˜๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์›๋ฆฌ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

  2. ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ๋ ˆ๋ฒจ์ด ์˜ฌ๋ผ๊ฐ€๋„ ์ž์ฃผ ๋‚˜์˜ฌ ๋“ฏ ํ•˜๋‹ˆ, ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ๋ฌธ์ œ๋ฅผ ์ข€ ๋” ํ’€์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN