[Python 파이썬]백준 10830번 행렬 제곱 풀이
문제
문제는 정말 간단하다.
그냥 주어지는 행렬의 B제곱만 구하면 되는 일
말이 간단하지만 입력은 1000억까지다.
입력이 굉장히 크기도하고, 제곱이면 분할정복으로 접근할 수 있지 않을까..? 라는 생각으로 접근한다면
거듭제곱 분할정복으로 모두 쉽게 풀지 않을까 싶으나
80%에서 뭐가 틀렸을까 계속 고민하게 만드는 문제랄까..,
풀이
- 첫 번째는 행렬을 곱하는 함수를 만들자.
어쨋건 행렬을 곱해야하니 행렬을 곱하는 함수를 하나 정의해주자.
def multiply(matrix1, matrix2):
global n
result = []
for i in range(n):
result2 = []
for j in range(n):
value = 0
for t in range(n):
value += matrix1[i][t] * matrix2[t][j]
result2.append(value % 1000)
result.append(result2)
return result
행렬은 총 계산이 (행렬 크기)^3 번일어나니까 가볍게(?) for문 3개로 처리해주자.
아 문제에서 1000으로 나눈 나머지를 출력하랬으니 % 1000을 계속 해줘야한다.
(결과에서만 나누면.., 숫자가 너무 커져서 실행이 안 돼..,)
- 두 번째는 거듭제곱을 하는 함수를 만들자.
지수 거듭제곱 분할정복 함수는 많이 써봤으니까..!(피보나치 풀 때도 그렇고)
def power(matrix, exponent):
if exponent <= 1:
return matrix
else:
if exponent % 2 == 0:
new_exponent = power(matrix, exponent // 2)
return multiply(new_exponent, new_exponent)
else:
new_exponent = power(matrix, exponent // 2)
return multiply(multiply(new_exponent, new_exponent), matrix)
다만, 정수와는 다르게 기본 값을 행렬로 주는거..!
그리고 new_exponent
계산할 때, integer division 쓰는 거..,
이제 입력만 받고 함수에만 넣으면 뚝딱이다.
그러나, 80%의 장벽에서 막히고 마는데..,,,
결국 테케 막 입력해보다가
행렬 원소가 1000이고 B가 1일 때, 1000으로 나눈 나머지를 출력하면 0이 나와야하는데,
B가 1일 때, 함수 호출을 안 하고 그냥 출력하니 1000이 그대로 나와서 틀렸던거..,
아무튼 이 부분만 보완하면 무난히 클리어 된다..!
코드
def multiply(matrix1, matrix2):
global n
result = []
for i in range(n):
result2 = []
for j in range(n):
value = 0
for t in range(n):
value += matrix1[i][t] * matrix2[t][j]
result2.append(value % 1000)
result.append(result2)
return result
def power(matrix, exponent):
if exponent <= 1:
return matrix
else:
if exponent % 2 == 0:
new_exponent = power(matrix, exponent // 2)
return multiply(new_exponent, new_exponent)
else:
new_exponent = power(matrix, exponent // 2)
return multiply(multiply(new_exponent, new_exponent), matrix)
n, k = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(n)]
if k == 1:
for i in range(n):
for j in range(n):
mat[i][j] = mat[i][j] % 1000
z = mat
else:
z = power(mat, k)
for x in range(n):
print(*z[x])
끝!
Author And Source
이 문제에 관하여([Python 파이썬]백준 10830번 행렬 제곱 풀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ashooozzz/Python-파이썬백준-10830번-행렬-제곱-풀이저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)