728x90
문제
문제 링크 : https://www.acmicpc.net/problem/17089
17089번: 세 친구
첫째 줄에 사람의 수 N(3 ≤ N ≤ 4,000), 친구 관계의 수 M(0 ≤ M ≤ 4,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계를 의미하는 두 정수 A, B가 주어진다. 친구 관계는 A와 B, 그리고 B와 A가 친
www.acmicpc.net
CODE
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
frd = [[False for _ in range(n)] for _ in range(n)] # 친구 여부
cnt = [0 for _ in range(n)] # 친구 수
for i in range(m):
i1, i2 = map(int, input().split())
frd[i1 - 1][i2 - 1] = True
frd[i2 - 1][i1 - 1] = True
cnt[i1 - 1] += 1
cnt[i2 - 1] += 1
result = 12001
for i in range(n):
for j in range(i + 1, n):
if not frd[i][j]: # A와 B가 친구가 아닌 경우
continue
for k in range(j + 1, n):
if not frd[i][k] or not frd[j][k]: # A와 C 또는 B와 C가 친구가 아닌 경우
continue
result = min(result, cnt[i] + cnt[j] + cnt[k] - 6)
if result == 12001:
print(-1)
else:
print(result)
풀이
💡 idea
- n명 중 세 명을 뽑는 경우를 모두 고려한다
- 세 명이 서로 친구인지 검사한 뒤 이전에 저장한 result 보다 작다면 저장한다
💡 implementation
- 친구 수를 저장할 때마다 frd에서 친구 수를 세는 과정을 생략하기 위해 cnt 리스트에 각 사람의 친구 수를 저장
- frd[i][j] == True이면, i와 j가 친구임을 나타낸다. 따라서 False인 경우 친구가 아니기 때문에 해당 경우를 건너뛴다
if not frd[i][j]:
continue
결과
728x90
'Baekjoon' 카테고리의 다른 글
[BOJ / 백준] 16637번 괄호 추가하기 파이썬(Python) 문제 풀이 (0) | 2021.08.04 |
---|---|
[BOJ / 백준] 17088번 등차수열 변환 파이썬(Python) 문제 풀이 (0) | 2021.08.03 |
[BOJ / 백준] 2422번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 파이썬(Python) 문제 풀이 (0) | 2021.08.01 |
[BOJ / 백준] 2210번 숫자판 점프 파이썬(Python) 문제 풀이 (0) | 2021.08.01 |
[BOJ / 백준] 15686번 치킨 배달 파이썬(Python) 문제 풀이 (1) | 2021.08.01 |