728x90
문제
문제 링크 : https://www.acmicpc.net/problem/2422
2422번: 한윤정이 이탈리아에 가서 아이스크림을 사먹는데
첫째 줄에 정수 N과 M이 주어진다. N은 아이스크림 종류의 수이고, M은 섞어먹으면 안 되는 조합의 개수이다. 아래 M개의 줄에는 섞어먹으면 안 되는 조합의 번호가 주어진다. 같은 조합은 두 번
www.acmicpc.net
CODE
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
ice = [[False for _ in range(n)] for _ in range(n)]
for i in range(m):
i1, i2 = map(int, input().split())
ice[i1 - 1][i2 - 1] = True
ice[i2 - 1][i1 - 1] = True
result = 0
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
if not ice[i][j] and not ice[i][k] and not ice[j][k]:
result += 1
print(result)
풀이
💡 idea
- 각 아이스크림 종류 별로 섞어먹으면 안 되는 조합의 번호를 저장
- [브루트 포스] 모든 조합에 대해 섞어먹으면 안 되는 조합인지 검사한다
💡 implementation
- (초기) 조건문에 in을 사용한 경우 : 시간이 5배 이상 걸린다 🤦
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
if j not in ice[i] and k not in ice[i] and k not in ice[j]:
result += 1
˙ ice에도 n번 아이스크림에 섞어먹으면 안 되는 조합의 번호를 리스트로 저장
˙ in 연산이 리스트 전체를 순회하기 때문에 시간이 오래 걸린다 → ice를 boolean 값 가진 이중리스트로 수정
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
if not ice[i][j] and not ice[i][k] and not ice[j][k]:
result += 1
- 조합을 생성할 때, itertools의 combinations를 사용할 수도 있다
for i in combinations(range(n), 3):
if ice[i[0]][i[1]] or ice[i[0]][i[2]] or ice[i[1]][i[2]]:
continue
result += 1
˙ 코드는 간편해지지만, 시간이 584ms로 조금 느려진다!
결과
728x90
'Baekjoon' 카테고리의 다른 글
[BOJ / 백준] 17088번 등차수열 변환 파이썬(Python) 문제 풀이 (0) | 2021.08.03 |
---|---|
[BOJ / 백준] 17089번 세 친구 성공 파이썬(Python) 문제 풀이 (0) | 2021.08.02 |
[BOJ / 백준] 2210번 숫자판 점프 파이썬(Python) 문제 풀이 (0) | 2021.08.01 |
[BOJ / 백준] 15686번 치킨 배달 파이썬(Python) 문제 풀이 (1) | 2021.08.01 |
[BOJ / 백준] 17088번 등차수열 변환 파이썬(Python) 문제 풀이 (0) | 2021.07.31 |