백준 10830

HJ seo·2022년 8월 31일
0

Coding Test(Python)

목록 보기
24/45

문제 링크

문제 설명.

행렬의 n제곱을 한 결과를 출력하는 문제이다.(각각의 원소는 1000으로 나누었을 때의 나머지.)

input으로는 두 수 A,B, 그리고 이후에 차례대로 AxA행렬이 하나 주어진다.

# example from 문제
3 3  # A B
1 2 3
4 5 6
7 8 9  # 3x3 행렬

풀이 코드.

from sys import stdin

n,m = map(int,stdin.readline().strip().split())
mat = [list(map(int,stdin.readline().strip().split())) for _ in range(n)]

# I_{n,n}
result = [[0]*n for _ in range(n)]
for i in range(n):
    result[i][i] = 1

# 연산 정의
def mat_mult(mat1,mat2,n):
    result = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            tmp = 0
            for k in range(n):
                tmp += mat1[i][k]*mat2[k][j]
            result[i][j] = tmp%1000
    
    return result

#계산
while m != 0:
    if m%2 == 1:
        result = mat_mult(mat,result,n)
    
    m = m//2
    mat = mat_mult(mat,mat,n)
    
for i in result:
    print(*i)

짧은 문제 설명과 마찬가지로 설명할 것도 길지 않다. 이전 문제와 비슷하게 거듭제곱에 따라 곱을 해주는 연산이 약간 달라진다. 이 경우 연산을 한번 하는데 필요한 시간비용이 필연적으로 크게 드는 편이라 이전 문제와 다르게 단위를 2로 쪼겠다.(쓰면서 드는 생각은 bitmasking을 이용해도 좋았을 것 같다는 생각이?)


잡담

아ㅏㅏㅏㅏㅏㅏ 예비군 가기 싫다..
글을 쓰고 있는 것이 시간이 너무 오래 걸리는 것은 매우 단점이다..

profile
다양한 분야에 관심이 많은 초보 개발자 입니다.

0개의 댓글

관련 채용 정보