1043-python

2023. 5. 11. 09:56·알고리즘

r

문제를 해석해보면 각라인에 파티가 있는데 그 중 진실을 아는 사람이 하나라도 있으면 그 파티에서는 지민이는 거짓말쟁이로 판단되어진다. 그래서 생각한것이 Union&find를 떠올렸다. 파티에 잇는 사람들을 노드들로 생각하고 잇고 나서 find를 통해 만약 진실을 아는 사람이 있으면 그 연결한 노드들에서는 거짓말을 하면 안되는 것이다. 

예제4

import sys
input  = sys.stdin.readline
N,M = map(int,input().split())
peoplelist = list(map(int,input().split()))[1:]
uplist = [i for i in range(N+1)]

for i in peoplelist:
    uplist[i] = 0 #정답을 아는놈드은 0으로

def Union(a,b):
    x,y = find(a),find(b)
    if(x<y):
        uplist[y]=x
    else:
        uplist[x] = y
def find(x):
    if x == uplist[x]:
        return x
    return find(uplist[x])
party = []
for k in range(M):
    partylist = list(map(int,input().split()))[1:]
    party.append(partylist)
    for i in range(len(partylist)-1):
        Union(partylist[i],partylist[i+1])
        
ans = 0
for par in party:
    for i in par:
        if (find(i)==0):
            break
        else:
            ans+=1
print(ans)

1트 실패. 해설을하자면 진실을 아는 사람들은 uplist의  값을 0으로 초기화 하고 그 이후 파티리스트를 받으며 각 파티 참여인원을 union해주어 선을 이어준다. 파티라는 리스트에 추가해주고 마지막에 이중 포문을 돌면서 각 파티들을 하나씩 꺼내면서 파티에 있는 참여인원중 find해준것이 0이면 break으로 탈출! 아니라면 정답에 +1해주는 코드이다. 그런데 문제가 생겼다. 답이 틀리다. 그 이유를 찾아보니 마지막에서 if(find해주어서 0일경우만 탈출시키고 아니라면 정답에 1을 추가해주었는데 이러면 만약 파티인원이 두명인데 그 두명모두 find가 0이아니라면 각각의 인원이 추가되어버리면서 ans이 정답보다 많게 나온다. 그래서 고쳐준 코드가

import sys
input  = sys.stdin.readline
N,M = map(int,input().split())
peoplelist = list(map(int,input().split()))[1:]
uplist = [i for i in range(N+1)]

for i in peoplelist:
    uplist[i] = 0 #정답을 아는놈드은 0으로

def Union(a,b):
    x,y = find(a),find(b)
    if(x<y):
        uplist[y]=x
    else:
        uplist[x] = y
def find(x):
    if x == uplist[x]:
        return x
    return find(uplist[x])
party = []
for k in range(M):
    partylist = list(map(int,input().split()))[1:]
    party.append(partylist)
    for i in range(len(partylist)-1):
        Union(partylist[i],partylist[i+1])
        
ans = 0
for par in party:
    lie = True
    for i in par:
        if (find(i)==0):
            lie = False
            break
    if(lie == True):
        ans+=1
print(ans)

마지막에 lie라는 변수를 설정해주고 진실을 아는 사람이 없는 파티에서만 ans+=1을해주어 정답을 제대로 세줄수 있었다.

'알고리즘' 카테고리의 다른 글

17142-python풀이  (1) 2023.05.22
백준2143- python (gold 3)  (0) 2023.05.21
[프로그래머스]-이모티콘할인행사(swift)  (1) 2023.05.04
알고리즘 2023kakaoblind-개인정보 수집 유효기간(python)  (0) 2023.04.30
프로그래머스-귤고르기(Python)  (0) 2023.04.29
'알고리즘' 카테고리의 다른 글
  • 17142-python풀이
  • 백준2143- python (gold 3)
  • [프로그래머스]-이모티콘할인행사(swift)
  • 알고리즘 2023kakaoblind-개인정보 수집 유효기간(python)
2료일
2료일
좌충우돌 모든것을 다 정리하려고 노력하는 J가 되려고 하는 세미개발자의 블로그입니다. 편하게 보고 가세요
  • 2료일
    GPT에게서 살아남기
    2료일
  • 전체
    오늘
    어제
    • 분류 전체보기 (121) N
      • SWIFT개발 (29)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (30)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
      • CS (3)
      • 도서관 (2) N
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
2료일
1043-python
상단으로

티스토리툴바