Skip to content

Commit dd7e965

Browse files
committed
solved(python): baekjoon 1533
1 parent 5338b87 commit dd7e965

File tree

4 files changed

+106
-0
lines changed

4 files changed

+106
-0
lines changed

baekjoon/python/1533/__init__.py

Whitespace-only changes.

baekjoon/python/1533/main.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import itertools
2+
import sys
3+
4+
read = lambda: sys.stdin.readline().rstrip()
5+
6+
7+
class Problem:
8+
def __init__(self):
9+
self.n, self.s, self.e, self.t = map(int, read().split())
10+
self.matrix = [list(map(int, list(read()))) for _ in range(self.n)]
11+
12+
self.mod = 1_000_003
13+
self.size = self.n * 5
14+
15+
def solve(self) -> None:
16+
time, matrix, result = (
17+
self.t,
18+
self.build_expanded_matrix(),
19+
[[int(i == j) for j in range(self.size)] for i in range(self.size)],
20+
)
21+
22+
while time > 0:
23+
if time % 2 == 1:
24+
result = self.matrix_multiply(result, matrix)
25+
matrix = self.matrix_multiply(matrix, matrix)
26+
time //= 2
27+
28+
print(result[(self.e - 1) * 5][(self.s - 1) * 5] % self.mod)
29+
30+
def build_expanded_matrix(self) -> list[list[int]]:
31+
matrix = [[0] * self.size for _ in range(self.size)]
32+
33+
for idx, time in itertools.product(range(self.n), range(4)):
34+
matrix[idx * 5 + time + 1][idx * 5 + time] = 1
35+
36+
for x, y in itertools.product(range(self.n), range(self.n)):
37+
if (delay := self.matrix[x][y]) and delay > 0:
38+
matrix[y * 5][x * 5 + (delay - 1)] = 1
39+
40+
return matrix
41+
42+
def matrix_multiply(self, matrix_x: list[list[int]], matrix_y: list[list[int]]) -> list[list[int]]:
43+
result = [[0 for _ in range(self.size)] for _ in range(self.size)]
44+
45+
for x, y in itertools.product(range(self.size), range(self.size)):
46+
if matrix_x[x][y] == 0:
47+
continue
48+
49+
for z in range(self.size):
50+
result[x][z] += matrix_x[x][y] * matrix_y[y][z]
51+
result[x][z] %= self.mod
52+
53+
return result
54+
55+
56+
if __name__ == "__main__":
57+
Problem().solve()

baekjoon/python/1533/sample.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[
2+
{
3+
"input": [
4+
"3 1 3 5",
5+
"012",
6+
"201",
7+
"120"
8+
],
9+
"expected": [
10+
"8"
11+
]
12+
}
13+
]

baekjoon/python/1533/test_main.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import json
2+
import os.path
3+
import unittest
4+
from io import StringIO
5+
from unittest.mock import patch
6+
7+
from parameterized import parameterized
8+
9+
from main import Problem
10+
11+
12+
def load_sample(filename: str):
13+
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
14+
15+
with open(path, "r") as file:
16+
return [(case["input"], case["expected"]) for case in json.load(file)]
17+
18+
19+
class TestCase(unittest.TestCase):
20+
@parameterized.expand(load_sample("sample.json"))
21+
def test_case(self, case: str, expected: list[str]):
22+
# When
23+
with (
24+
patch("sys.stdin.readline", side_effect=case),
25+
patch("sys.stdout", new_callable=StringIO) as output,
26+
):
27+
Problem().solve()
28+
29+
result = output.getvalue().rstrip()
30+
31+
# Then
32+
self.assertEqual("\n".join(expected), result)
33+
34+
35+
if __name__ == "__main__":
36+
unittest.main()

0 commit comments

Comments
 (0)