🧩 Problem Solving/[λ°±μ€€]

[λ°±μ€€] 1043 거짓말 (python 파이썬)

μ œλ΄‰μ•„ 2022. 7. 9. 01:16

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

 

1043번: 거짓말

μ§€λ―Όμ΄λŠ” νŒŒν‹°μ— κ°€μ„œ 이야기 ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€. νŒŒν‹°μ— 갈 λ•Œλ§ˆλ‹€, μ§€λ―Όμ΄λŠ” 지민이가 κ°€μž₯ μ’‹μ•„ν•˜λŠ” 이야기λ₯Ό ν•œλ‹€. μ§€λ―Όμ΄λŠ” κ·Έ 이야기λ₯Ό 말할 λ•Œ, μžˆλŠ” κ·ΈλŒ€λ‘œ μ§„μ‹€λ‘œ λ§ν•˜κ±°λ‚˜ μ—„μ²­λ‚˜κ²Œ

www.acmicpc.net


아이디어

1. 반볡문

  • 문제 λŠλ‚Œμ΄ 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ 쒀비같이 κ°μ—Όμ‹œν‚€λŠ” 것이라 생각
  • κ·Έλž˜μ„œ 진싀을 μ•„λŠ” μ‚¬λžŒκ³Ό 같이 μžˆλŠ” μ‚¬λžŒλ“€μ„ 진싀을 μ•„λŠ” μ‚¬λžŒμœΌλ‘œ λ°”κΏ¨λ‹€.
  • 근데 이러면 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ΄ λ°”λ€Œμ–΄μ„œ 전체 νŒŒν‹°λ₯Ό 또 탐색해야 ν•˜κ³  이λ₯Ό 계속 λ°˜λ³΅ν•΄μ•Ό ν•΄μ„œ μ‹€νŒ¨ν–ˆλ‹€.

2. κ·Έλž˜ν”„

  • κ·ΈλŸ¬λ‹€κ°€ λ™μ‹œμ— ν•œ λ²ˆμ— ν•΄μ•Ό λœλ‹€λŠ” 것을 κΉ¨λ‹«κ³  κ·Έλž˜ν”„λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ κ²°μ •
  • 각 νŒŒν‹°λ§ˆλ‹€ μžˆλŠ” μ‚¬λžŒλ“€μ„ 두 λͺ…μ”© μ–‘λ°©ν–₯으둜 μ΄μ–΄μ£ΌλŠ” 걸둜 κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ—ˆλ‹€.
  • 그리고 처음 진싀을 μ•„λŠ” μ‚¬λžŒλ“€λ‘œ μ‹œμž‘ν•΄ 탐색을 ν•˜λ©΄ ν•œ λ²ˆμ— 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ„ λͺ¨λ‘ 찾을 수 μžˆλ‹€.

 

 


전체 μ½”λ“œ

import sys
from collections import deque
from itertools import combinations

N, M = map(int,input().split())
ans = 0
truth_flag = False
party_list = []
who_know_truth = [False] * (N + 1)

know = [int(x) for x in sys.stdin.readline().rstrip().split()]
know_member = know[1:]

for k in know_member:
    who_know_truth[k] = True

graph = [[] for _ in range(N + 1)]

for _ in range(M):
    party = [int(x) for x in sys.stdin.readline().rstrip().split()]
    party_member = party[1:]
    party_list.append(party_member)
    for pair in combinations(party_member,2):
        if not pair[1] in graph[pair[0]]:
            graph[pair[0]].append(pair[1])
        if not pair[0] in graph[pair[1]]:
            graph[pair[1]].append(pair[0])

def bfs(n):

    deq = deque()
    deq.append(n)
    visited[n] = True

    while deq:
        x = deq.popleft()

        for i in graph[x]:
            if not visited[i]:
                who_know_truth[i] = True
                visited[i] = True
                deq.append(i)

for i in know_member:
    visited = [False] * (N + 1)
    bfs(i)

ans = M
for party in party_list:
    for p in party:
        if who_know_truth[p] == True:
            ans -= 1
            break
print(ans)

μ½”λ“œ μ„€λͺ…

who_know_truth = [False] * (N + 1)

know = [int(x) for x in sys.stdin.readline().rstrip().split()]
know_member = know[1:]

for k in know_member:
    who_know_truth[k] = True

μ²˜μŒμ— 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ„ μ€„λ‘œ μž…λ ₯λ°›μœΌλ©΄ 리슀트 맨 μ•žμ—λŠ” μ‚¬λžŒ 수 μ΄λ―€λ‘œ μŠ¬λΌμ΄μ‹± ν•΄μ€€λ‹€.

그리고 진싀을 μ•„λŠ” μ‚¬λžŒμ˜ λ²ˆν˜ΈλŠ” True둜 ν‘œμ‹œν•΄μ€€λ‹€.

 

graph = [[] for _ in range(N + 1)]

for _ in range(M):
    party = [int(x) for x in sys.stdin.readline().rstrip().split()]
    party_member = party[1:]
    party_list.append(party_member)
    for pair in combinations(party_member,2):
        if not pair[1] in graph[pair[0]]:
            graph[pair[0]].append(pair[1])
        if not pair[0] in graph[pair[1]]:
            graph[pair[1]].append(pair[0])

κ·Έλž˜ν”„ λ§Œλ“œλŠ” νŒŒνŠΈλ‹€.

μ—¬κΈ°μ„œλ„ μŠ¬λΌμ΄μ‹± ν•΄μ£Όκ³  전체 νŒŒν‹° λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•΄λ‘”λ‹€.(λ‚˜μ€‘μ— ν•„μš”)

 

그리고 μ‘°ν•© ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 2λͺ…μ”© νŽ˜μ–΄λ₯Ό λ§Œλ“€μ–΄ 인접 λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•΄μ€€λ‹€.

 

 

def bfs(n):

    deq = deque()
    deq.append(n)
    visited[n] = True

    while deq:
        x = deq.popleft()

        for i in graph[x]:
            if not visited[i]:
                who_know_truth[i] = True
                visited[i] = True
                deq.append(i)

for i in know_member:
    visited = [False] * (N + 1)
    bfs(i)

진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ„ κΈ°μ€€μœΌλ‘œ κ·Έλž˜ν”„ 탐색을 ν•΄μ€€λ‹€.

방문을 ν•  λ•Œλ§ˆλ‹€ 진싀을 μ•„λŠ” μ‚¬λžŒμœΌλ‘œ λ°”κΏ”μ€€λ‹€.(False -> True)

 

ans = M
for party in party_list:
    for p in party:
        if who_know_truth[p] == True:
            ans -= 1
            break
print(ans)

그리고 각 νŒŒν‹°λ§ˆλ‹€ 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ ν•œ λͺ…이라도 μ‘΄μž¬ν•˜λ©΄ break ν•˜κ³  νŒŒν‹° μ΄κ°œμˆ˜μ—μ„œ -1 ν•΄μ€€λ‹€.