백준 문제풀이

1043 - 거짓말 / gold 4 / set 활용

RonLee 2022. 10. 25. 11:38

- 첫 시도 / 틀린 코드

"""
1043 - 거짓말 / gold 4
"""
import sys
from collections import deque

input = sys.stdin.readline

n, m = map(int, input().split())
true_list = list(map(int, input().split()))
true_set = set(true_list[1:])
party_list = deque()
for _ in range(m):
    party_info = list(map(int, input().split()))
    party_list.append(set(party_info[1:]))

count = 0
while party_list:
    party_set = party_list.popleft()
    if true_set & party_set:
        count += 1
        if party_set - true_set:
            true_set.update(party_set - true_set)
            true_set.discard(100)
    else:
        if 100 in party_set:
            pass
        else:
            party_set.add(100)
            party_list.append(party_set)

print(m - count)

 

- 정답 코드

"""
1043 - 거짓말 / gold 4 / set 활용
"""
import sys

input = sys.stdin.readline

# 1. Input
n, m = map(int, input().split())
true_list = list(map(int, input().split()))
true_set = set(true_list[1:])

party_list = []
for _ in range(m):
    party_info = list(map(int, input().split()))
    party_list.append(set(party_info[1:]))

# 2. ture_set / add
for _ in range(m):
    for party_set in party_list:
        if party_set & true_set:
            true_set = true_set.union(party_set)

# 3. count
count = 0
for party_set in party_list:
    if party_set & true_set:
        continue
    count += 1

print(count)

1. Input

- n, m : (진실을 아는 사람 수, 파티 수)

- true_set : (진실을 아는 사람 번호) set로 저장

- party_list : (각 파티에 참여하는 사람들 번호 각 인덱스로 저장) / list 안의 set로 저장

 

2. true_set / add 

- 2중 for문 돌면서, 파티에서 진실을 알게 되는 사람들 true_set에 추가 

 

첫 번째 for 문 : m(파티의 수)만큼 돌기

두 번째 for 문 : party_list 길이 만큼 돌기

 

3. count

- party_list 돌면서, count 

 

 

틀린 코드 피드백

 

틀렸던 코드에서는 파티에서 진실을 알게 되는 사람들 또한 생각해서 코드를 짰지만,

특정 파티에서 true_set 에 들어가지 않는 사람들 발생!

 

EX)

(처음에 진실을 몰랐던 사람) -> (파티에서 진실을 알게 된 사람) 이 있다고 예를 들면, 

 

(파티에서 진실을 알게 된 사람) 또한 전파?가 가능하기에 

 

특정 파티 ( 파티에서 진실을 알게 된 사람 + 진실을 모르는 사람들 ) 가 있으면,

(진실을 모르는 사람들) -> (특정 파티에서 진실을 알게 된 사람) 또한 true_set에 추가 해야 함!

 

즉, true_set 에는 해당 번호의 사람이 들어 간다!

1. 진실을 처음부터 아는 사람

2. 진실을 처음부터 아는 사람으로 인해 / 파티에서 진실을 알게 된 사람

3. 파티에서 진실을 알게 된 사람으로 인해 / 특정 파티에서 진실을 알게 된 사람

... 특정 파티에서 진실을 알게 된 사람으로 인해 / 특정특정 파티에 진실을 알게 된 사람 (반복😜)