[백준][파이썬] 17089 - 세 친구
문제 번호 : 17089번 세 친구
문제 출처 : https://www.acmicpc.net/problem/17089
Code
import sys
n, m = map(int, input().split())
relations = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]
friends = [set() for _ in range(n)]
for relation in relations:
friends[relation[0]-1].add(relation[1])
friends[relation[1]-1].add(relation[0])
num_friends = m
for a in range(n):
for b in friends[a]:
for c in friends[b-1]:
if c in friends[a]:
num_friends = min(num_friends, len(friends[a]) + len(friends[b-1]) + len(friends[c-1]) - 6)
if num_friends < m:
print(num_friends)
else:
print(-1)
Idea
- 입력된 친구가 모두
A
,B
,C
의 친구인 경우 세 친구의 친구 수 합의 최대는m - 6
이다. A
를 정하고B
는A
의 친구 중 한명이고C
는B
의 친구이면서A
의 친구인 경우에서 친구 수의 최소값을 찾아낸다.b > a
,c > b
조건을 넣은 이유는 먼저 순회한 조합을 순회하지 않기 위함이다. 이 두 조건이 없다면 순열처럼 동작할 것이지만 이 조건으로 인해서 조합이 되어서 시간 복잡도가 줄어든다. 이 조건 두 줄만으로 1880ms에서 92ms로 시간이 확 줄었다.
'프로그래밍 > BAEKJOON' 카테고리의 다른 글
[백준][파이썬] 23080번 - 스키테일 암호 (0) | 2021.10.07 |
---|---|
[백준][파이썬] 17406번 - 배열 돌리기 4 (0) | 2021.09.18 |
[백준][파이썬] 2422번 - 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2021.09.16 |
[백준][파이썬] 2210번 - 숫자판 점프 (0) | 2021.08.21 |
[백준][파이썬] 15686번 - 치킨 배달 (0) | 2021.08.21 |