Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](시뮬) 백준 17144번 : 미세먼지 안녕! 본문
728x90
<접근 방법>
- 공기청정기의 좌표에 의해 위쪽의 순환 및 아래쪽의 순환이 이루어지므로 공기청정기의 좌표를 따로 구해놓는다.
- T번의 반복이 이루어지므로, 반복문 안에서 확산 및 순환을 구현한다.
- 미세먼지의 확산은 모든 칸에서 동시에 일어나므로 plus라는 하나의 배열을 임시로 만들어 확산될 먼지들의 합을 구해준 후, 원래의 배열인 arr에 plus값들을 모두 더해준다.
- 위쪽 순환과 아래쪽 순환을 일으키는데,
위쪽 순환의 경우 시계 방향으로 돌며 배열의 값을 서로 바꿔주고,
아래쪽 순환의 경우 반시계 방향으로 돌며 배열의 값을 서로 바꿔준다. - 순환이 끝난 후, 공기청정기의 처음 나가는 칸은 항상 먼지가 없으므로 0의 값으로, 원래 공기청정기의 칸은 -1의 값으로 대입해준다.
- 모든 칸의 먼지의 양을 더해준다.
R, C, T = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(R)]
# [0] 공기청정기의 좌표 찾기
air_conditioner = -1
for i in range(R):
if arr[i][0] == -1:
air_conditioner = i
break
# [1] T번의 확산 및 순환
for _ in range(T):
# 확산되는 먼지의 값을 계산하기 위한 임의의 배열 plus 만들기
plus = [[0]*C for _ in range(R)]
# 확산
for i in range(R):
for j in range(C):
if arr[i][j] > 0:
scatter = arr[i][j]//5
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = i + di
nj = j + dj
if 0<=ni<R and 0<=nj<C and arr[ni][nj] != -1:
plus[ni][nj] += scatter
arr[i][j] -= scatter
for i in range(R):
for j in range(C):
arr[i][j] += plus[i][j]
# 순환
directions = {0:(-1, 0), 1:(0, 1), 2:(1, 0), 3:(0, -1)}
# 위쪽 순환
si, sj, d = air_conditioner, 0, 0
while True:
ni = si + directions[d][0]
nj = sj + directions[d][1]
if (ni, nj) == (air_conditioner, 0):
break
if 0<=ni<=air_conditioner and 0<=nj<C:
arr[si][sj], arr[ni][nj] = arr[ni][nj], arr[si][sj]
si, sj = ni, nj
else:
d = (d+1)%4
arr[air_conditioner][0], arr[air_conditioner][1] = -1, 0
# 아래쪽 순환
si, sj, d = air_conditioner+1, 0, 2
while True:
ni = si + directions[d][0]
nj = sj + directions[d][1]
if (ni, nj) == (air_conditioner+1, 0):
break
if air_conditioner+1<=ni<R and 0<=nj<C:
arr[si][sj], arr[ni][nj] = arr[ni][nj], arr[si][sj]
si, sj = ni, nj
else:
d = (d+3)%4
arr[air_conditioner+1][0], arr[air_conditioner+1][1] = -1, 0
# [2] 남아있는 미세먼지의 총량
answer = 0
for i in range(R):
answer += sum(arr[i])
print(answer+2)
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](시뮬) 백준 20056번 : 마법사 상어와 파이어볼 (0) | 2024.03.11 |
---|---|
[Python] 백준 17140번 : 이차원 배열과 연산 (2) | 2024.03.09 |
[Python](BFS) 백준 16234번 : 인구 이동 (0) | 2024.03.01 |
[Python](DFS) 백준 15683번 : 감시 (0) | 2024.03.01 |
[Python](BFS&DFS / BFS&Itertools) 백준 14502번 : 연구소 (2가지 방법) (2) | 2024.02.05 |