728x90
12850. 본대 산책 2
난이도 : 골드 1
소요 시간 : 15분
날짜 : 2024.12.29
언어 : 파이썬
알고리즘 유형 : 행렬, 그래프, 분할 정복
설명 보기전에 문제 풀어보러 가기
1. 문제 설명
- 그래프가 주어진다. 만들어야 한다. 귀찮다....
- d분동안 산책한다.
- 정보과학관을 돌아오는 경로의 경우의 수를 구한다.
2. 해결 방식
- 행렬에 대한 이해를 필요로 하는 문제이다.
- i분 산책한 경로 배열 * j분 산책한 경로 배열 을 하면 i+j분 산책을 한 경로를 구할 수 있다.
- 이를 활용하면 시간복잡도를 log2(d)로 해결가능.
3. 정답 코드
# 숭실대 지도 그리기
arr = [[0] * 8 for _ in range(8)]
arr[0][1], arr[1][0] = 1, 1
arr[0][2], arr[2][0] = 1, 1
arr[1][2], arr[2][1] = 1, 1
arr[1][3], arr[3][1] = 1, 1
arr[2][3], arr[3][2] = 1, 1
arr[2][4], arr[4][2] = 1, 1
arr[3][4], arr[4][3] = 1, 1
arr[3][5], arr[5][3] = 1, 1
arr[4][5], arr[5][4] = 1, 1
arr[4][7], arr[7][4] = 1, 1
arr[5][6], arr[6][5] = 1, 1
arr[6][7], arr[7][6] = 1, 1
div = 1000000007
def sol(d, grp = arr):
if d == 1:
return grp
grp_n = sol(d // 2, grp)
if not d % 2:
return multiple(grp_n, grp_n)
else:
return multiple(multiple(grp_n, grp_n), grp)
def multiple(x, y):
res = [[0]*8 for _ in range(8)]
for i in range(8):
for j in range(8):
for m in range(8):
res[i][j] += x[i][m] * y[m][j]
res[i][j] %= div
return res
ans = sol(int(input()))
print(ans[0][0])
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 2042. 구간 합 구하기 / Python (0) | 2025.01.01 |
---|---|
Baekjoon 2263. 트리의 순회 / Python (0) | 2024.12.30 |
Baekjoon 28707. 배열 정렬 / Python (1) | 2024.12.28 |
Baekjoon 10775. 공항 / Python (0) | 2024.12.28 |