코딩 공부

[Python](시뮬) 백준 17144번 : 미세먼지 안녕! 본문

삼성 SW 역량 테스트 기출 문제

[Python](시뮬) 백준 17144번 : 미세먼지 안녕!

Algomalgo 2024. 3. 4. 20:49
728x90


<접근 방법>

  1. 공기청정기의 좌표에 의해 위쪽의 순환 및 아래쪽의 순환이 이루어지므로 공기청정기의 좌표를 따로 구해놓는다.
  2. T번의 반복이 이루어지므로, 반복문 안에서 확산 및 순환을 구현한다.
  3. 미세먼지의 확산은 모든 칸에서 동시에 일어나므로 plus라는 하나의 배열을 임시로 만들어 확산될 먼지들의 합을 구해준 후, 원래의 배열인 arr에 plus값들을 모두 더해준다.
  4. 위쪽 순환과 아래쪽 순환을 일으키는데,
    위쪽 순환의 경우 시계 방향으로 돌며 배열의 값을 서로 바꿔주고,
    아래쪽 순환의 경우 반시계 방향으로 돌며 배열의 값을 서로 바꿔준다.
  5. 순환이 끝난 후, 공기청정기의 처음 나가는 칸은 항상 먼지가 없으므로 0의 값으로, 원래 공기청정기의 칸은 -1의 값으로 대입해준다.
  6. 모든 칸의 먼지의 양을 더해준다.
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)

예제 4번의 결과 도출 과정

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90