티스토리 뷰
반응형
📎 간략한 문제 정리
- N by N 행렬 A가 주어질 때, A의 B제곱을 구하는 프로그램을 작성하는 문제입니다.
📈 문제 분석
- 곱셈 연산을 거듭제곱하는 문제이므로 백준 알고리즘의 곱셈(1629번) 풀이 를 참고할 필요가 있습니다.
🙋♂️ 내가 처음 생각한 해결 방법
- 분할 정복을 활용합니다.
💻 풀이한 코드
from sys import stdin
input = stdin.readline
a, b = map(int, input().split())
matrix = [list(map(lambda x: x % 1000, map(int, input().split()))) for _ in range(a)]
def power(m, y):
if y == 1:
return m
partial = power(m, y // 2)
partial_square = multiply_matrix(partial, partial)
if y % 2 == 0:
return partial_square
elif y % 2 == 1:
return multiply_matrix(partial_square, m)
def multiply_matrix(matrix_1, matrix_2):
length = len(matrix_1)
result = [[0 for _ in range(length)] for _ in range(length)]
for i in range(length):
for j in range(length):
result[i][j] = sum([(matrix_1[i][k] * matrix_2[k][j])%1000 for k in range(length)])%1000
return result
answer = power(matrix, b)
for i in range(a):
print(' '.join(map(str, answer[i])))
📝 해결 과정에서 만난 문제, 고민들
- 집중을 못해서인지 매우 쉬운문제임에도 불구하고 굉장히 오래 고민했습니다. 메소드 구현에서 뜬금없는 변수를 넣거나 마지막 출력문을 정답 규격에 맞지 않고 개인적인 확인을 위해 만들어둔 상태로 테스트하여 계속 틀렸습니다가 반복되었습니다. 의외로 이런 곳에서 틀릴 수 있기 때문에 항상 입력과 출력을 경계해야할 필요가 있습니다.
- 파이썬의 경우 int의 범위가 부족할 경우 자동으로 long 타입으로 변환되기 때문에 문제가 없지만 다른 사람들이 풀이한 C++ 등의 풀이를 보면 해당 오류가 많이 발생했음을 알 수 있습니다. 주어진 범위가 매우 넓기 때문에 int안에 해당 숫자를 할당하는 것만으로도 오류가 발생할 수 있습니다. 입출력의 범위를 디테일하게 체크할 필요가 있습니다.
- map 함수 자체가 iterable하므로 어떤 리스트에 여러 연산을 적용하고 싶으면 map 안에 map을 구현하는 구조로 작성할 수 있습니다.
반응형
'알고리즘 학습 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘] - 토마토 (7569번) with Python (0) | 2021.04.20 |
---|---|
[백준 알고리즘] - K번째 수 (1300번) with Python (0) | 2021.04.19 |
[백준 알고리즘] - 곱셈 (1629번) with Python (0) | 2021.04.16 |
[백준 알고리즘] - 숫자 카드 2 (10816번) with Python (0) | 2021.04.15 |
[백준 알고리즘] - 행렬 곱셈 (2740번) with Python (0) | 2021.04.14 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 나무자르기#BOJ#이분탐색#Python
- API#lazy#
- django#slicing
- 암호코드#dp#BOJ#Python
- django
- 종이자르기#분할정복#BOJ#Python
- filter#isalnum#lower
- 파이썬알고리즘인터뷰#4장
- N으로 표현#DP#Programmers#Python
- 순열사이클#BOJ#Python
- Swift#Tuples#Range
- 병든 나이트#BOJ#탐욕법#Python
- 날짜 계산#BOJ#완전탐색#Python
- Distinct#Codility#Python
- 텀 프로젝트#백준알고리즘#Python
- 토마토#백준알고리즘#Python
- 배열합치기#분할정복#BOJ#Python
- 미로 탐색#백준알고리즘#Python
- 섬의개수#백준알고리즘#Python
- 백준 알고리즘#BackTracking
- 공유기 설치#BOJ#이분탐색#Python
- PassingCars#Codility#Python
- Triangle#Sorting#Codility#Python
- 랜선자르기#이분탐색#BOJ#Python
- 리모컨#완전탐색#BOJ#Python
- 쿼드트리#BOJ#분할정복#Python
- 반복수열#백준알고리즘#Python
- 터틀비치#리콘#xbox#controller
- Brackets#Stacks and Queues#Codility#Python
- NumberofDiscIntersections#Codility#Sort#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함