Skip to content

Commit ba89a72

Browse files
committed
codetree.ai 삼성전자 2025 하반기 오후 1번 문제 AI 로봇청소기
문제 링크: https://www.codetree.ai/ko/frequent-problems/all/problems/ai-robot
1 parent c7a7ca7 commit ba89a72

12 files changed

Lines changed: 340 additions & 0 deletions

File tree

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from collections import deque
2+
3+
4+
def solve():
5+
N, K, L = map(int, input().split())
6+
dt = []
7+
robots = deque()
8+
9+
for _ in range(N):
10+
dt.append(list(map(int, input().split())))
11+
12+
for _ in range(K):
13+
r, c = list(map(int, input().split()))
14+
robots.append([r - 1, c - 1])
15+
16+
for _ in range(L):
17+
robots_next = deque()
18+
19+
# 1 청소기 이동
20+
while robots:
21+
robot_sr, robot_sc = robots.popleft()
22+
visited = [[False] * N for _ in range(N)]
23+
24+
# 로봇이 있는 위치는 방문할 수 없도록, True로 표시함
25+
for r, c in robots + robots_next:
26+
visited[r][c] = True
27+
28+
candidates = []
29+
if dt[robot_sr][robot_sc] > 0:
30+
candidates.append([0, robot_sr, robot_sc])
31+
32+
queue = deque([[0, robot_sr, robot_sc]])
33+
visited[robot_sr][robot_sc] = True
34+
35+
while queue:
36+
depth, sr, sc = queue.popleft()
37+
drc = [[0, 1], [1, 0], [0, -1], [-1, 0]]
38+
39+
for dr, dc in drc:
40+
nr, nc = sr + dr, sc + dc
41+
if 0 <= nr < N and 0 <= nc < N and visited[nr][nc] == False:
42+
if dt[nr][nc] == 0: # 빈칸이면
43+
queue.append([depth +1, nr, nc])
44+
elif dt[nr][nc] > 0: # 먼지가 있으면
45+
candidates.append([depth +1, nr, nc])
46+
47+
visited[nr][nc] = True
48+
49+
if len(candidates) == 0:
50+
robots_next.append([robot_sr, robot_sc])
51+
else:
52+
candidates.sort()
53+
_, r, c = candidates[0]
54+
robots_next.append([r, c])
55+
56+
robots = robots_next
57+
58+
# 2 청소
59+
for r_r, r_c in robots:
60+
banghyang = [
61+
[[0, 1], [1, 0], [-1, 0], [0, 0]], # 오른쪽
62+
[[0, 1], [1, 0], [0, -1], [0, 0]], # 아래쪽
63+
[[1, 0], [0, -1], [-1, 0], [0, 0]], # 왼쪽
64+
[[0, 1], [0, -1], [-1, 0], [0, 0]] # 위쪽
65+
]
66+
67+
# 어느 방향을 청소해야 하는지 찾기
68+
candidates = []
69+
for idx_banghyang in range(len(banghyang)):
70+
local_candi = 0
71+
for bh_r, bh_c in banghyang[idx_banghyang]:
72+
nr, nc = bh_r + r_r, bh_c + r_c
73+
if 0 <= nr < N and 0 <= nc < N:
74+
if dt[nr][nc] > 0: # 이동할수 있는 칸이고, 먼지가 있는 칸일 때
75+
local_candi += min(20, dt[nr][nc])
76+
77+
candidates.append([local_candi * -1, idx_banghyang])
78+
79+
candidates.sort()
80+
# idx_banghyang 방향이 먼지량이 가장큰 방향
81+
_, idx_banghyang = candidates[0]
82+
83+
for bh_r, bh_c in banghyang[idx_banghyang]:
84+
nr, nc = bh_r + r_r, bh_c + r_c
85+
if 0 <= nr < N and 0 <= nc < N:
86+
if dt[nr][nc] > 0: # 먼지가 있는 칸일 때
87+
dt[nr][nc] -= 20 # 격자마다 청소할 수 있는 최대 먼지량은 20입니닫.
88+
if dt[nr][nc] < 0:
89+
dt[nr][nc] = 0
90+
91+
# 3. 먼지 축적
92+
for r in range(len(dt)):
93+
for c in range(len(dt[0])):
94+
if dt[r][c] > 0:
95+
dt[r][c] += 5
96+
97+
# 4. 먼지 확산
98+
tmp = [[0] * N for _ in range(N)]
99+
for r in range(len(dt)):
100+
for c in range(len(dt[0])):
101+
if dt[r][c] == 0:
102+
drc = [[0, 1], [1, 0], [0, -1], [-1, 0]]
103+
dust_0 = 0
104+
for dr, dc in drc:
105+
nr, nc = r + dr, c + dc
106+
if 0 <= nr < N and 0 <= nc < N:
107+
if dt[nr][nc] > 0:
108+
dust_0 += dt[nr][nc]
109+
tmp[r][c] = (dust_0 // 10)
110+
111+
for r in range(len(dt)):
112+
for c in range(len(dt[0])):
113+
if tmp[r][c] > 0:
114+
dt[r][c] += tmp[r][c]
115+
116+
answer = 0
117+
for r in range(len(dt)):
118+
for c in range(len(dt[0])):
119+
if dt[r][c] > 0:
120+
answer += dt[r][c]
121+
122+
print(answer)
123+
124+
if answer == 0:
125+
return
126+
127+
128+
# Press the green button in the gutter to run the script.
129+
if __name__ == '__main__':
130+
solve()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
6 3 1
2+
-1 0 0 0 -1 0
3+
0 8 8 0 -1 0
4+
13 10 -1 -1 -1 12
5+
11 -1 0 0 0 25
6+
-1 0 0 10 0 0
7+
-1 0 0 10 23 18
8+
4 4
9+
2 1
10+
6 2
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
123
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
7 5 3
2+
0 0 0 0 0 38 56
3+
13 0 24 0 0 -1 0
4+
0 0 0 0 70 0 0
5+
32 0 0 58 -1 0 0
6+
23 50 0 0 0 0 0
7+
39 0 0 0 7 0 0
8+
-1 -1 0 0 0 0 0
9+
3 3
10+
1 4
11+
5 5
12+
1 3
13+
3 7
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
401
2+
396
3+
397
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
3 3 5
2+
0 0 18
3+
49 17 12
4+
41 0 25
5+
3 2
6+
1 2
7+
1 1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
80
2+
30
3+
0
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
3 1 2
2+
99 33 -1
3+
-1 0 0
4+
0 71 0
5+
3 1
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
217
2+
209
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
30 50 50
2+
0 93 -1 0 0 0 0 0 0 0 -1 0 0 2 0 0 -1 0 0 0 0 -1 -1 15 -1 15 0 0 0 0
3+
-1 0 -1 0 -1 0 0 0 0 -1 0 -1 0 0 -1 -1 0 0 0 -1 -1 0 0 -1 0 0 -1 -1 0 0
4+
0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 -1 -1 0 0 0
5+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 37 0 0 0 -1 -1 -1 0 0 0
6+
-1 0 0 0 0 0 0 -1 0 0 -1 0 -1 0 0 -1 0 0 0 0 0 -1 0 0 0 -1 0 0 0 0
7+
0 0 0 0 0 0 0 98 9 0 -1 0 0 0 0 58 0 0 0 96 0 0 0 -1 -1 0 0 0 0 13
8+
0 -1 0 0 0 0 0 0 59 0 0 0 34 0 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0
9+
-1 0 0 -1 0 0 0 0 0 0 0 0 -1 12 0 -1 0 0 -1 17 0 -1 -1 0 0 0 0 32 0 0
10+
0 0 -1 0 0 0 100 -1 -1 0 -1 -1 -1 0 0 0 0 0 0 0 -1 35 0 -1 0 0 0 0 0 0
11+
0 -1 17 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 9 -1 0 0
12+
0 -1 0 0 -1 89 0 0 0 0 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0 -1 -1 0 0 50 0
13+
0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 0 -1 54 0 0 0 0 0 0 48 0 -1 0 0
14+
-1 0 0 0 0 -1 0 0 0 0 0 0 -1 0 0 0 0 0 37 -1 0 0 0 0 0 0 0 0 -1 0
15+
-1 -1 0 0 0 0 -1 -1 -1 -1 0 -1 0 0 0 0 0 -1 0 0 -1 0 0 5 0 0 0 0 0 -1
16+
-1 -1 69 0 0 0 -1 -1 -1 0 24 -1 0 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
17+
-1 83 0 3 0 0 0 0 0 0 0 -1 0 -1 0 0 0 0 0 0 0 0 65 0 0 -1 -1 0 0 0
18+
0 0 37 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 -1 16 0 -1 0 0 0 -1 -1 -1 -1 0 0 -1
19+
0 0 0 0 0 0 17 0 0 -1 -1 0 -1 0 0 0 0 -1 -1 0 97 0 0 0 0 -1 -1 0 0 0
20+
-1 0 0 0 0 0 -1 -1 -1 0 0 62 0 0 0 0 0 0 0 0 62 0 0 74 -1 0 -1 0 0 0
21+
0 -1 0 -1 0 0 -1 -1 63 0 0 0 -1 0 0 91 0 0 0 0 0 0 -1 0 -1 -1 0 0 0 0
22+
0 0 0 0 -1 0 0 -1 -1 0 -1 0 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0 34 0
23+
0 0 -1 -1 0 0 -1 0 0 0 0 -1 0 0 0 54 0 0 0 0 86 -1 0 0 0 88 0 0 0 0
24+
-1 0 0 -1 0 0 0 0 0 -1 0 0 0 -1 0 0 0 0 0 -1 0 -1 0 0 0 0 0 0 0 0
25+
0 0 0 0 0 0 0 15 69 0 0 0 0 0 38 -1 0 0 0 0 0 -1 0 -1 0 0 0 0 0 0
26+
0 0 -1 -1 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0 -1 0
27+
0 0 0 -1 -1 0 24 -1 0 0 0 91 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0
28+
0 0 6 -1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 60 0 8 0 0 -1 -1 -1 0 0
29+
-1 0 0 70 0 76 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 -1 -1 0 0 -1 0 0 0 -1 0
30+
0 0 98 0 0 0 0 0 -1 -1 0 0 0 45 0 0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 -1 0
31+
0 -1 0 89 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 19 -1 0 0
32+
30 16
33+
11 16
34+
3 21
35+
23 26
36+
21 18
37+
6 12
38+
3 30
39+
5 9
40+
11 10
41+
4 15
42+
28 10
43+
18 14
44+
29 4
45+
16 30
46+
11 27
47+
30 15
48+
9 29
49+
27 17
50+
4 23
51+
15 26
52+
27 9
53+
8 18
54+
16 20
55+
12 24
56+
22 11
57+
22 10
58+
26 1
59+
4 11
60+
6 3
61+
6 14
62+
8 24
63+
23 2
64+
29 12
65+
2 29
66+
28 24
67+
28 5
68+
11 30
69+
19 29
70+
11 1
71+
3 28
72+
13 7
73+
17 4
74+
29 24
75+
4 10
76+
12 2
77+
14 3
78+
10 29
79+
10 19
80+
4 24
81+
11 19

0 commit comments

Comments
 (0)