0. 문제 링크
https://www.acmicpc.net/problem/17144
1. 풀이 방법
사실 구현은 그냥 하라는 대로 하면 돼서 크게 어렵지는 않은 것 같다.
먼지를 분산시키고, 이후에 바람을 불었다.
다만 바람을 부는 과정이 조금 쉽지 않았는데, 방향을 전환하면서, 현재 값은 이전 값이 저장된 변수로 대체하고, 현재 값을 변수에 넣는 과정을 반복하면 해결되었다.
2. 코드
r, c, t = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(r)]
vac = []
for i in range(r):
if maps[i][0] == -1:
vac.append(i) # 청정기의 위치를 찾음
def spread(maps, sp_maps): # 먼지 분산
for i in range(r):
for j in range(c):
if maps[i][j] != -1 and maps[i][j] > 0:
sp_dust = maps[i][j] // 5
for dy, dx in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
ny, nx = i + dy, j + dx
if 0 <= ny < r and 0 <= nx < c and maps[ny][nx] != -1:
sp_maps[ny][nx] += sp_dust
maps[i][j] -= sp_dust
sp_maps[i][j] += maps[i][j]
return sp_maps # 새로운 맵에 넣음
def up(): # 위쪽 바람
dy, dx = [0, -1, 0, 1], [1, 0, -1, 0]
dir = 0
before = 0 # 이전 값을 저장
y, x = vac[0], 1 # 바로 오른쪽부터 시작
while True:
ny, nx = y + dy[dir], x + dx[dir] # 움직임
if y == vac[0] and x == 0:
maps[y][x] = 0 # 만약 청정기에 도달하면 0으로 만들고 끝냄
break
if not (0 <= ny < r and 0 <= nx < c): # 모서리에 도달하면 방향을 전환함
dir += 1
continue
maps[y][x], before = before, maps[y][x] # 현재 값을 저장하고, 이전 값을 현재 위치에 넣음
y, x = ny, nx
def down(): # 아래쪽 바람
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
dir = 0
before = 0
y, x = vac[1], 1
while True:
ny, nx = y + dy[dir], x + dx[dir]
if y == vac[1] and x == 0:
maps[y][x] = 0
break
if not(0 <= ny < r and 0 <= nx < c):
dir += 1
continue
maps[y][x], before = before, maps[y][x]
y, x = ny, nx
def count(maps):
sum = 0
for i in range(r):
for j in range(c):
sum += maps[i][j]
return sum
for _ in range(t):
maps = spread(maps, [[0] * c for _ in range(r)])
up()
down()
print(count(maps))
3. 마무리
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 17822 - 원판 돌리기 (0) | 2023.02.23 |
---|---|
[백준 - Python] 17780 - 새로운 게임 (0) | 2023.02.23 |
[백준 - Python] 16234 - 인구 이동 (0) | 2023.02.23 |
[백준 - Python] 5557 - 1학년 (0) | 2023.02.23 |
[백준 - Python] 9252 - LCS 2 (0) | 2023.02.23 |