Skip to content

Commit d7e09dc

Browse files
committed
solved(python): programmers
- 2025 프로그래머스 코드챌린지 1차 예선 / 지게차와 크레인
1 parent 9ec1d8c commit d7e09dc

4 files changed

Lines changed: 143 additions & 0 deletions

File tree

programmers/2025_프로그래머스_코드챌린지_1차_예선/python/지게차와_크레인/__init__.py

Whitespace-only changes.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import itertools
2+
from collections import deque
3+
from typing import List, Tuple, Set
4+
5+
6+
def solution(storage: List[str], requests: List[str]):
7+
rows, cols = len(storage), len(storage[0])
8+
9+
sides, visited = init_sides(rows, cols), set()
10+
11+
for request in requests:
12+
selected = {
13+
(x, y)
14+
for x, y in (sides if len(request) == 1 else set(itertools.product(range(cols), range(rows)))) - visited
15+
if storage[y][x] == request[0]
16+
}
17+
visited |= selected
18+
sides |= find_nested_sides(rows, cols, selected if len(request) == 0 else selected & sides, sides, visited)
19+
20+
return rows * cols - len(visited)
21+
22+
23+
def init_sides(rows: int, cols: int) -> Set[Tuple[int, int]]:
24+
return (
25+
{(x, 0) for x in range(cols)}
26+
| {(x, rows - 1) for x in range(cols)}
27+
| {(0, y) for y in range(rows)}
28+
| {(cols - 1, y) for y in range(rows)}
29+
)
30+
31+
32+
def find_nested_sides(
33+
rows: int,
34+
cols: int,
35+
selected: Set[Tuple[int, int]],
36+
sides: Set[Tuple[int, int]],
37+
visited: Set[Tuple[int, int]],
38+
) -> Set[Tuple[int, int]]:
39+
stack, nested = deque(list(selected)), set()
40+
41+
while stack:
42+
x, y = stack.pop()
43+
44+
for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
45+
if 0 <= x + dx < cols and 0 <= y + dy < rows and (x + dx, y + dy) not in sides | nested:
46+
nested.add((x + dx, y + dy))
47+
if (x + dx, y + dy) in visited:
48+
stack.append((x + dx, y + dy))
49+
50+
return nested
51+
52+
53+
if __name__ == "__main__":
54+
solution(list(input()), list(input()))
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
[
2+
{
3+
"params": [
4+
[
5+
"AZWQY",
6+
"CAABX",
7+
"BBDDA",
8+
"ACACA"
9+
],
10+
[
11+
"A",
12+
"BB",
13+
"A"
14+
]
15+
],
16+
"expected": "11"
17+
},
18+
{
19+
"params": [
20+
[
21+
"HAH",
22+
"HBH",
23+
"HHH",
24+
"HAH",
25+
"HBH"
26+
],
27+
[
28+
"C",
29+
"B",
30+
"B",
31+
"B",
32+
"B",
33+
"H"
34+
]
35+
],
36+
"expected": "4"
37+
},
38+
{
39+
"params": [
40+
[
41+
"AAAAA",
42+
"ABCDA",
43+
"AGAEA",
44+
"AZAFA",
45+
"ZYAAA"
46+
],
47+
[
48+
"BB",
49+
"DD",
50+
"Z",
51+
"Y",
52+
"Z",
53+
"G",
54+
"C",
55+
"E",
56+
"F"
57+
]
58+
],
59+
"expected": "16"
60+
}
61+
]
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: str):
20+
# When
21+
result = solution(*params)
22+
23+
# Then
24+
self.assertEqual(expected, str(result))
25+
26+
27+
if __name__ == "__main__":
28+
unittest.main()

0 commit comments

Comments
 (0)