[boj 17144] [Python] 미세먼지 안녕!

해질녘·2022년 1월 30일
0

ps

목록 보기
7/22

[boj 17144][Python] 미세먼지 안녕!

문제 링크

1학년 때 배웠던 C프로그래밍 과제 문제가 생각나는 구현 문제였다. 당시에 제일 끔찍했던 것은 달팽이 모양으로 배열 원소를 이동시키는 것이다. 이건 지금 해도 자신 없다.

주의사항

row, col을 아직도 헷갈리는 사람

입력으로 들어온 R이 행의 수를 나타내길래, 그걸 나중에 알고서 떼잉; 이런 사소한 문제 오류가; 라고 생각했는데 Row = 행이었다

충격적... 아래 코드는 그걸 나중에 수습하느라 row, col, r, c가 제대로 나와있지 않고 뒤죽박죽이다

이건 알게 된 후로부터 매일매일 헷갈린다 (사실 문제 입력이 n, m으로 주어졌으면 모르고 넘어갔을듯)

Rows and Columns in Spreadsheet Documents | WinForms Controls | DevExpress  Documentation

다음엔 헷갈리지 말자

동시에 진행되는 확산

먼지가 여러개가 있는데 확산이 동시에 진행된다고 한다. 그래서 effect 레이어(2dl list)를 하나 만들어서 확산 상태를 기록한 후 원본에 덮어씌워줬다.

결과는 모든 칸의 합

인데 공기청정기 위치 -1 이 두개 있으니 +2 더해줬다

먼지 밀어밀어

위 사진처럼 번호를 붙여서 먼지 이동을 했는데, 겹치는 구간을 고려하면 8부터 1 순서로 진행해야 한다. 반대로 하면 각 번호마다 신경쓸 게 생긴다.

코드

# 17144 미세먼지 안녕!

from sys import stdin
input = stdin.readline


def findDust(room, r, c):
    dustlist = []
    # 원소: (먼지양, col, row)
    for col in range(r):
        for row in range(c):
            if room[col][row] > 0:
                dustlist.append((room[col][row], col, row))
    return dustlist


def isValidLoc(x, y, r, c, room):
    if x >= 0 and x < r and y >= 0 and y < c:
        if room[x][y]!=-1:
            return True
    return False

r, c, t = map(int, input().split())
room = [[0] for _ in range(r)]
for col in range(r):
    room[col] = list(map(int, input().split()))
# 문제는 1,1 부터인데 이거는 0,0 부터임 (별상관x)

# 공기청정기 정보 저장
purifierLoc = []
for col in range(r):
    if room[col][0] == -1:
        purifierLoc.append((col, 0))

dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]

for time in range(t):
    # 1. 확산
    # 미세먼지 위치와 정보 저장
    dustlist = findDust(room, r, c)
    # 확산 레이어 생성
    effect = [[0 for _ in range(c)] for _ in range(r)]
    
    # 모든 먼지에 대해 4방향 확산
    for dust in dustlist:
        dustValue, x, y = dust[0], dust[1], dust[2]
        for d in range(4):
            xx = x + dx[d]
            yy = y + dy[d]
            if not isValidLoc(xx, yy, r, c, room):
                continue    # 막힌 곳은 확산 진행 x
            effect[xx][yy] += room[x][y] // 5
            effect[x][y] -= room[x][y] // 5
    # effect 덧씌우기 
    for col in range(r):
        for row in range(c):
            room[col][row] += effect[col][row]
    
    # 2. 공기청정기 작동
    p1 = purifierLoc[0][0]
    p2 = purifierLoc[1][0]
    # (8)
    for i in range(p2+1, r-1):
        room[i][0] = room[i+1][0]
    # (7)
    for i in range(p1-1, 0, -1):
        room[i][0] = room[i-1][0]
    # (6)
    for i in range(0, c-1):
        room[r-1][i] = room[r-1][i+1]
    # (5)
    for i in range(0, c-1):
        room[0][i] = room[0][i+1]
    # (4)
    for i in range(r-1, p1, -1):
        room[i][c-1] = room[i-1][c-1]
    # (3)
    for i in range(0, purifierLoc[0][0]):
        room[i][c-1] = room[i+1][c-1]    
    # (2)
    for i in range(c-1, 1, -1):
        room[p2][i] = room[p2][i-1]
    # (1)
    for i in range(c-1, 1, -1):
        room[p1][i] = room[p1][i-1]
    room[p1][1] = 0
    room[p2][1] = 0
     
rst = 0
for col in range(r):
    for row in range(c):
        rst += room[col][row]

print(rst+2)    #공청기정보-1*2

이번에 col row 헷갈린 거만 빼면 차분하게 잘 한 거 같다

... 근데 2시간 정도 걸린듯

공기청정기가 돌아다니기까지 하면 더욱 악랄한 문제가 되지 않을까?

0개의 댓글