728x90

https://www.acmicpc.net/problem/3989

 

3989번: 유행성 독감

첫째 날에 K, M, N이 주어진다. (1 ≤ K ≤ 1018, 3 ≤ M ≤ 1500, N < M) N은 첫째 날 독감에 걸린 사람의 수이다. 둘째 줄에는 첫째 날 독감에 걸린 사람이 공백으로 구분되어 주어진다.

www.acmicpc.net

# 런타임 에러. 중복 조합
k, m, n = map(int, input().split())       # 3, 100, 3
num = list(map(int, input().split()))     # [2, 3, 4]

if k == 1:                                # 첫째날이면 [2, 3, 4] 그대로 출력
    num.sort()
    for i in num:
        print(i, end= ' ')
else:                                    # 첫째날 이후       
    # k = 2 이면 [2, 3, 4] 2H2 => [(2,2),(2,3),(2,4),(3,3),(3,4),(4,4)]
    # k = 3 이면 [2, 3, 4] 3H2 => 
[(2,2,2),(2,2,3),(2,2,4),(2,3,3),(2,3,4),(2,4,4),(3,3,3),(3,3,4),(3,4,4),(4,4,4)]
    a = list(set(list(itertools.combinations_with_replacement(num,k))))
    aa = []
    for i in range(len(a)):
        mul = 1
        for j in range(len(a[0])):
            mul = (mul * a[i][j])        # mul = 1 * 2 => 2 * 2 => 2 * 2
        if mul >= m:                     # 마을 인원 수 보다 크면 나머지 삽입
            aa.append(mul%m)
        else:                           # 마을 인원 수 보다 작으면 그대로 삽입
            aa.append(mul)

    aa = list(set(aa))
    aa.sort()
    for i in aa:
        print(i, end = ' ')
# 시간 초과
k, m, n = map(int, input().split())        # 3, 100, 3
num = list(map(int, input().split()))      # [2, 3, 4]
case = num

for K in range(k-1):
    next = set()
    for j in range(n):
        for i in range(len(case)):
            if num[j]*case[i]%m not in next:
                next.add(num[j]*case[i]%m)      # {4, 6, 8, 9, 12, 16} => {32, 64, 36, 8, 12, 16, 48, 18, 24, 27}
    case = list(next)      # [4, 6, 8, 9, 12, 16] => [32, 64, 36, 8, 12, 16, 48, 18, 24, 27]

next = list(next)
next.sort()
for i in next:            # [8, 12, 16, 18, 24, 27, 32, 36, 48, 64]
    print(i, end = ' ')
# 시간 초과 - 한 배열만 쓰기, 깊은 복사
import copy
k, m, n = map(int, input().split())        # 3, 100, 3
num = list(map(int, input().split()))      # [2, 3, 4]
first = copy.deepcopy(num)                 # 깊은 복사

for K in range(k-1):
    pre = len(num)    # 6 => 9
    for j in range(len(num)):
        for i in range(n):
            if num[j]*first[i]%m not in num[pre:]:
                num.append(num[j]*first[i]%m)      
    # [2,3,4,4,6,8,9,12,16] => [4, 6, 8, 9, 12, 16, 8, 12, 16, 18, 24, 32, 27, 36, 48, 64

    del num[:pre]
    # [4,6,8,9,12,16] => [8, 12, 16, 18, 24, 32, 27, 36, 48, 64]
num.sort()
for i in num:            # [8, 12, 16, 18, 24, 27, 32, 36, 48, 64]
    print(i, end = ' ')
반응형

'전.py' 카테고리의 다른 글

백준 1697 숨바꼭질  (0) 2020.12.13
백준 14225 부분수열의 합  (0) 2020.12.13
백준 2740 행렬 곱셈  (0) 2020.12.13
백준 2669 직사각형 네개의 합집합의 면적 구하기  (0) 2020.12.13
백준 6603 로또  (0) 2020.12.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기