알고리즘/baekjoon
[ baekjoon ] ㄷㄷㄷㅈ 19535번 ( python )
Yanoo
2021. 8. 15. 18:34
728x90
반응형
문제
백준 19535 ㄷㄷㄷㅈ 풀이 ( 파이썬 )
https://www.acmicpc.net/problem/19535
19535번: ㄷㄷㄷㅈ
첫 번째 줄에 주어진 트리가 D-트리라면 D, G-트리라면 G, DUDUDUNGA-트리라면 DUDUDUNGA를 출력한다.
www.acmicpc.net
풀이
일단 ㄷ을 구할 경우와 ㅈ을 구할 경우를 나눴다.
ㅈ를 구하는 방법은 노드 하나를 기준으로 연결된 노드가 3개 이상일 때 이 연결된 노드중 3개를 선택하면 된다.
degree[i] * (degree[i] - 1) * (degree[i] - 2) / 6 if degree[i] >= 3 else 0
위의 식은 nC3 일때의 식을 풀어 쓴것이다. (degree[i]가 3이상일 때는 풀어쓴 식 사용, 미만일 떄는 0)
ㄷ은 연결된 선을 기준(지금은 빨간 선)으로 연결된 두 노드(초록 노드)에 각각 연결된 점들을 곱해주면 ㄷ의 개수가 된다.
((degree[dot1] - 1) * (degree[dot2] - 1))
각 노드에 -1을 해준 이유는 초록 서로 초록 노드인 경우는 지우기 위함이다.
import sys
input = sys.stdin.readline
n = int(input())
lines = []
degree = [0] * (n + 1)
for i in range(n-1):
s, e = map(int, input().split())
lines.append((s, e))
degree[s] += 1
degree[e] += 1
d_cnt = 0
j_cnt = 0
# ㅈ 개수 구하기
for i in range(1, n + 1):
j_cnt += degree[i] * (degree[i] - 1) * (degree[i] - 2) / 6 if degree[i] >= 3 else 0
for line in lines:
dot1, dot2 = line
d_cnt += ((degree[dot1] - 1) * (degree[dot2] - 1))
if d_cnt > 3 * j_cnt:
print("D")
elif d_cnt < 3 * j_cnt:
print("G")
else:
print("DUDUDUNGA")
728x90
반응형