Skip to content

Commit 97738de

Browse files
committed
solved(python): programmers
- 연습문제 / 리코쳇 로봇
1 parent 1f3c524 commit 97738de

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

programmers/연습문제/python/리코쳇_로봇/__init__.py

Whitespace-only changes.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from collections import deque
2+
from typing import List, Tuple
3+
4+
5+
def solution(board: List[str]) -> int:
6+
matrix = [list(row) for row in board]
7+
n, m = len(matrix), len(matrix[0])
8+
9+
red, green = find_points(matrix)
10+
queue, visited = deque([(0, red)]), set()
11+
12+
while queue:
13+
step, (x, y) = queue.popleft()
14+
if (x, y) == green:
15+
return step
16+
17+
if (x, y) in visited:
18+
continue
19+
20+
visited.add((x, y))
21+
22+
for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
23+
nx, ny = x, y
24+
while 0 <= nx + dx < m and 0 <= ny + dy < n and matrix[ny + dy][nx + dx] != "D":
25+
nx, ny = nx + dx, ny + dy
26+
27+
if (x, y) != (nx, ny):
28+
queue.append((step + 1, (nx, ny)))
29+
30+
return -1
31+
32+
33+
def find_points(matrix: List[List[str]]) -> Tuple[Tuple[int, int], Tuple[int, int]]:
34+
red, green = (-1, -1), (-1, -1)
35+
36+
for y, row in enumerate(matrix):
37+
for x, value in enumerate(row):
38+
if value == "R":
39+
red = (x, y)
40+
if value == "G":
41+
green = (x, y)
42+
43+
return red, green
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[
2+
{
3+
"params": [
4+
[
5+
"...D..R",
6+
".D.G...",
7+
"....D.D",
8+
"D....D.",
9+
"..D...."
10+
]
11+
],
12+
"expected": 7
13+
},
14+
{
15+
"params": [
16+
[
17+
".D.R",
18+
"....",
19+
".G..",
20+
"...D"
21+
]
22+
],
23+
"expected": -1
24+
}
25+
]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
import os
3+
import unittest
4+
5+
from parameterized import parameterized
6+
7+
from .main import solution
8+
9+
10+
def load_sample(filename: str):
11+
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
12+
13+
with open(path, "r") as file:
14+
return [(case["params"], case["expected"]) for case in json.load(file)]
15+
16+
17+
class TestCase(unittest.TestCase):
18+
@parameterized.expand(load_sample("sample.json"))
19+
def test_case(self, params: list, expected: any):
20+
# When
21+
result = solution(*params)
22+
23+
# Then
24+
self.assertEqual(expected, result)
25+
26+
27+
if __name__ == "__main__":
28+
unittest.main()

0 commit comments

Comments
 (0)