๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 17144 - ๋นก๊ตฌํ˜„

by huis_log 2025. 7. 11.

์‹ค์ˆ˜ ์ „๋žต ์ •๋ฆฌ

์ด ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ ๋งž์Œ.

๊ทผ๋ฐ ์ˆœ์„œ ํ•˜๋‚˜ ํ‹€๋ฆฌ๋ฉด ๋ฐ”๋กœ ํ‹€๋ฆผ.

 

์ฃผ์˜์ 

ํ™•์‚ฐ์€ ์›๋ณธ ์ฝ๊ณ  ์ƒˆ ๊ทธ๋ฆฌ๋“œ์—๋งŒ ์จ์•ผ ์ถฉ๋Œ ์•ˆ ๋‚จ.

๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋Š” ๋ฐฉํ–ฅ ์ˆœ์„œ ์•ˆ ์™ธ์šฐ๋ฉด ๋งํ•จ.

์œ„๋Š” ๋ฐ˜์‹œ๊ณ„ → ์˜ค๋ฅธ์ชฝ, ์œ„, ์™ผ์ชฝ, ์•„๋ž˜.

์•„๋ž˜๋Š” ์‹œ๊ณ„ → ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์™ผ์ชฝ, ์œ„.

๊ฒฝ๊ณ„ ๋Œ๋ฆด ๋• ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜์”ฉ ํฌ๋ฌธ ๋Œ๋ ค์•ผ ํ•˜๊ณ  ์˜†์นธ 0 ์ฒ˜๋ฆฌ ์•ˆ ํ•˜๋ฉด ๋จผ์ง€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์„œ ํ‹€๋ฆผ.

์‹œ๋ฎฌ์€ ์•„์ด๋””์–ด๋Š” ์‰ฌ์šด๋ฐ ์† ๊ผฌ์ด๋ฉด ์ง€์˜ฅํ–‰.

๋ณต์‚ฌ ๊ทธ๋ฆฌ๋“œ ์“ฐ๊ณ  ๋ฐฉํ–ฅ ์ˆœ์„œ ์ œ๋Œ€๋กœ ์™ธ์šฐ๊ธฐ.


import sys
input=sys.stdin.readline

# ๋ฏธ์„ธ๋จผ์ง€ ํ™•์žฅ
def spread(grid):
    new_grid=[row[:] for row in grid]
    direcions=[(0,1),(-1,0),(0,-1),(1,0)]
    row=len(new_grid)
    col=len(new_grid[0])
    
    for y in range(row):
        for x in range(col):
            if grid[y][x]!=0 and grid[y][x]!=-1:
                spread_amount=grid[y][x]//5
                spread_count=0
                for dy,dx in direcions:
                    ny,nx=y+dy,x+dx
                    if 0<=ny<row and 0<=nx<col:
                        if grid[ny][nx]!=-1:
                            new_grid[ny][nx]+=spread_amount
                            spread_count+=1
                new_grid[y][x]-=spread_amount*spread_count
    
    return new_grid

# ์ฒญ์ •๊ธฐ์˜ (y,x) ์ขŒํ‘œ ๋ฐ˜ํ™˜
def find_cleaner(grid):
    row=len(grid)
    col=len(grid[0])
    air_pos=[]
    
    for y in range(row):
        for x in range(col):
            if grid[y][x]==-1:
                air_pos.append((y,x))
    return air_pos

# ๋ฐ˜์‹œ๊ณ„(์œ„์ชฝ) ์ •ํ™”
def purify_upper(grid, air_pos):
    R, C = len(grid), len(grid[0])
    y, _ = air_pos[0]
    new_grid = [row[:] for row in grid]

    # 1) ์ •ํ™”๊ธฐ ํ–‰ → ์˜ค๋ฅธ์ชฝ
    for x in range(1, C):
        new_grid[y][x] = grid[y][x-1]
    # 2) ์˜ค๋ฅธ์ชฝ ๋ ์—ด ↑ ์œ„๋กœ
    for i in range(y-1, -1, -1):
        new_grid[i][C-1] = grid[i+1][C-1]
    # 3) ๋งจ ์œ„ ํ–‰ ← ์™ผ์ชฝ
    for x in range(C-2, -1, -1):
        new_grid[0][x] = grid[0][x+1]
    # 4) ์™ผ์ชฝ ๋ ์—ด ↓ ์•„๋ž˜๋กœ
    for i in range(1, y+1):
        new_grid[i][0] = grid[i-1][0]

    # ์ •ํ™” ์œ„์น˜ ๋งˆ๋ฌด๋ฆฌ
    new_grid[y][1] = 0
    new_grid[y][0] = -1
    return new_grid

# ์‹œ๊ณ„(์•„๋ž˜์ชฝ) ์ •ํ™”
def purify_lower(grid, air_pos):
    R, C = len(grid), len(grid[0])
    y, _ = air_pos[1]
    new_grid = [row[:] for row in grid]

    # 1) ์ •ํ™”๊ธฐ ํ–‰ → ์˜ค๋ฅธ์ชฝ
    for x in range(1, C):
        new_grid[y][x] = grid[y][x-1]
    # 2) ์˜ค๋ฅธ์ชฝ ๋ ์—ด ↓ ์•„๋ž˜๋กœ
    for i in range(y+1, R):
        new_grid[i][C-1] = grid[i-1][C-1]
    # 3) ๋งจ ์•„๋ž˜ ํ–‰ ← ์™ผ์ชฝ
    for x in range(C-2, -1, -1):
        new_grid[R-1][x] = grid[R-1][x+1]
    # 4) ์™ผ์ชฝ ๋ ์—ด ↑ ์œ„๋กœ
    for i in range(R-2, y-1, -1):
        new_grid[i][0] = grid[i+1][0]

    # ์ •ํ™” ์œ„์น˜ ๋งˆ๋ฌด๋ฆฌ
    new_grid[y][1] = 0
    new_grid[y][0] = -1
    return new_grid

# ๋ฏธ์„ธ๋จผ์ง€ ์–‘ ๊ณ„์‚ฐ
def count_dust(grid):
    new_grid=[row[:] for row in grid]
    row=len(grid)
    col=len(grid[0])
    total=0
    
    for y in range(row):
        for x in range(col):
            if grid[y][x]==-1:
                continue
            total+=grid[y][x]
            
    return total
        
def main():
    r,c,t=map(int,input().split())
    grid=[list(map(int,input().split())) for _ in range(r)]
    air_pos=find_cleaner(grid)
   
    for _ in range(t):
        spreaded_grid=spread(grid)
        grid=purify_lower(purify_upper(spreaded_grid,air_pos),air_pos)

    print(count_dust(grid))

if __name__=="__main__":
    main()
๋ฐ˜์‘ํ˜•