새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1043 거짓말

by 언호 2022. 1. 3.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

진실을 아는 사람들과 진실을 모르는 사람들이 어떤 파티에서 접촉하면 모두 진실을 알게 되므로, DFS 탐색으로 같이 겹치는 사람들을 구하려 접근

2) 알고리즘

  • DFS

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')


def solution(person: list):                                 # 진실을 아는 사람들 구하는 함수 (진실을 아는 사람들)
    visited = [0] * (N+1)                                   # 사람 확인했는지 체크용 리스트

    stack = list(person.copy())
    while stack:
        node = stack.pop()
        if not visited[node]:
            visited[node] = 1
            for e in linked[node]:                          # 현재 사람과 접촉한 사람들
                if e not in truth and not visited[e]:       # 진실을 모르고, 아직 확인하지 않은 사람이면
                    stack.append(e)                         # 스택에 추가, 진실을 아는 명단에 추가
                    truth.add(e)



N, M = map(int, sys.stdin.readline().split())                   # 사람 수, 파티의 개수
cnt_truth, *truth = map(int, sys.stdin.readline().split())      # 진실을 아는 사람 수, 진실을 아는 명단
linked = [set() for _ in range(N+1)]                            # 사람들 접촉 관계
parties = []                                                    # 파티 리스트
answer = 0                                                      # 정답 변수

for _ in range(M):
    cnt_person, *person = map(int, sys.stdin.readline().split())    # 현재 파티의 사람 수, 파티에 참여한 사람 명단

    parties.append(set(person))                                     # 파티 리스트에 참여한 사람 추가
    while cnt_person > 1:                                           # 파티에 2명 이상 참여했을때, 접촉 관계 추가
        linked[person[cnt_person-1]].add(person[cnt_person-2])
        linked[person[cnt_person-2]].add(person[cnt_person-1])
        cnt_person -= 1

truth = set(truth)                      # 진실을 아는 사람 중복 제거 위함

solution(truth)                         # 진실을 아는 모든 사람 구하기

for party in parties:                   # 파티에 진실을 아는 사람이 한명도 없으면 정답 개수 증가
    if not truth.intersection(party):
        answer += 1

print(answer)                           # 출력

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

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

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 11657 타임머신  (0) 2022.01.05
[백준] 1504 특정한 최단 경로  (0) 2022.01.04
[백준] 9663 N-Queen  (0) 2022.01.02
[백준] 1759 암호 만들기  (0) 2022.01.01
[백준] 10819 차이를 최대로  (0) 2021.12.31

댓글