팀결성 : 그래프

주리·2022년 12월 19일
0

코테_그래프

목록 보기
1/1

로직

같은 팀 여부 확인
1. find 로직으로 각 학생의 루트노드 찾기

  • 루트노드가 아니라면 , 재귀적호출 ㄱㄱ
  1. 루트노드가 같으면 YES , 아니면 NO 출력

팀합치기 = union로직
1. a,b를 각 a,b의 루트노드로 변수 할당 (find로직)
2. if a<b → parent[a]=b

  • 아니면 반대로
  1. 학생의 부모리스트 (→루트노드가 될) parent=[]
    • 부모리스트를 1...N(i) 으로 초기화
  2. N,M 입력받기 : N학생의수(=팀번호) , M연산횟수
  3. M (for문) 번 돌면서
    • k,a,b 입력받기
    • if k 값이 0이면
      → 팀합치기
    • 1이면
      → 같은 팀 여부 확인
# 팀찾기 (루트노드 찾기)
def team_find(x,parent):
  if parent[x] != x:
    parent[x] = team_find(parent[x],parent)
  return parent[x]

# 팀합치기
def team_union(a,b,parent):
  a = team_find(a,parent)
  b = team_find(b,parent)
  if a<b:
    parent[b]=a
  else:
    parent[a]=b


n,m = map(int,input().split())
parent=[0] * (n+1)

# 부모 리스트 자기자신으로 초기화
for i in range(n+1):
  parent[i] = i

for i in range(m) :
  k,a,b = map(int,input().split())

  # 팀합치기
  if k==0 :
    team_union(a,b,parent)
  # 팀 확인하기
  else: 
    a = team_find(a,parent)
    b = team_find(b,parent)
    if a==b:
      print("YES")
    else:
      print("NO")

주의사항

  • find 로직 진행 시 → 재귀함수 호출 할 때 매개변수로 parent[x]를 줘야함
    → x를 그냥 주면 무한 재귀함수에 빠져벌임,,
  • 부모 리스트를 자기자신으로 초기화 하기전 (i) → [0]*(n+1)로 초기화 해주는 과정이 꼭 필요하다
  • 부모 리스트를 자기자신으로 초기화 할 때 0~(n+1) 까지 해주어야한다 → 문제에 제시되어있음
profile
완벽한 글 보다, 그 과정들을 기록하는 개발자

0개의 댓글