We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2573๋ฒˆ: ๋น™์‚ฐ - ํŒŒ์ด์ฌ

Redddy 2022. 5. 30. 21:21

๐Ÿงฉ๋ฌธ์ œ ํ•ด์„

์ด์ œ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ๋”ฑ ๋ณด๋ฉด ๊ทธ๋ž˜ํ”„ ๊ด€๋ จ ๋ฌธ์ œ๋ผ๋Š” ๊ฑธ ๋ฐ”๋กœ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
'๋น™์‚ฐ ํ•œ ๋ฉ์ด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ'๊ฐ€ ์กฐ๊ฑด์— ๋“ค์–ด๊ฐ€์žˆ์œผ๋‹ˆ, ๋ฌด์กฐ๊ฑด ๋น™์‚ฐ์€ ์ฃผ์–ด์ง„๋‹ค. 
๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋น™์‚ฐ์—์„œ ์–ผ์Œ์˜ ์œ„์น˜์™€ ๊ทธ ์–ผ์Œ ์ฃผ์œ„ ํ™˜๊ฒฝ์„ ์‚ดํ”ผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น™์‚ฐ์ด ์ชผ๊ฐœ์กŒ๋Š”์ง€ BFS๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ๋‹ค. 

 

๐Ÿ”‰ ํ’€์ด ์ „ ์žก๋‹ด

์•ž์„œ ๋งํ•œ ๋ฌธ์ œ ํ•ด์„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด๋‚ด๋Š”๋ฐ์—๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค. 
์ฒซ๋ฒˆ์งธ ์ œ์ถœ์—๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ(RecursionError)๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋• ๋‹นํ™ฉํ•˜์ง€ ๋ง๊ณ  sys ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€ sys.setrecursionlimit(n) ์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ n์€ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
sys.setrecursionlimit(10**4) ์„ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋”๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค..
์ƒ๊ฐํ•ด๋‚ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์˜€๊ธฐ์— ์งˆ๋ฌธ ๊ฒ€์ƒ‰ ํƒญ์— ๋“ค์–ด๊ฐ€์„œ ์งˆ๋ฌธ๋“ค์„ ์‚ดํ”ผ๋Š” ๋„์ค‘ pypy์™€ python ๋‘˜์— ๊ด€ํ•œ ์ •๋‹ตํŒ์ • ๊ธ€์„ ๋ณด์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์ˆ˜์ •์—†์ด python์„ pypy๋กœ ์ œ์ถœํ•˜์˜€๋”๋‹ˆ ์ •๋‹ตํŒ์ • ๋ฐ›์•˜๋‹ค..ใ…Žใ…Ž

์ดํ›„ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ, ํŒŒ์ด์ฌ์œผ๋กœ ์ •๋‹ตํŒ์ • ๋ฐ›์€ ์ฝ”๋“œ๋“ค์€ ๋ฌผ์˜ ์œ„์น˜๋ฅผ ๋งค๋ฒˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ €์žฅํ•ด๋‘์–ด์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜์˜€๋‹ค.

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋์— ๋งž์•˜์Šต๋‹ˆ๋‹ค!!

 

๐Ÿ“• ํ’€์ด

์–ผ์Œ์ธ ๊ณณ์„ ์ฐพ๊ณ , ๊ทธ ์ฃผ์œ„์˜ ๋ฌผ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ฒดํฌํ•˜์—ฌ ์–ผ์Œ์„ ๋…น์—ฌ์ฃผ์—ˆ๋‹ค.
์œ„ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•˜์˜€๋Š”๋ฐ, ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๋น™์‚ฐ์ด ๋‘˜ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์กŒ๋Š”์ง€ BFS๋กœ ํ™•์ธํ•ด์ฃผ๊ณ , ์ชผ๊ฐœ์กŒ๋‹ค๋ฉด ๋ฐ˜๋ณตํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋น™์‚ฐ์ด ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ์•„์ง ๋น™์‚ฐ์ด ๋‘˜ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, ํ˜„์žฌ ๋น™์‚ฐ์€ ์ „๋ถ€ 0์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด ๊ฒฝ์šฐ๋„ ์ฒดํฌํ•˜์—ฌ 0์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋˜์—ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

import sys 
sys.setrecursionlimit(10**4)
input = sys.stdin.readline

# ์ƒํ•˜์ขŒ์šฐ๋กœ ์–ผ์Œ ์‚ดํ•„ ์ขŒํ‘œ
dx = [1,-1,0,0]
dy = [0,0,1,-1]

n,m = map(int,input().rstrip().split())
# ์–ผ์Œ๊ณผ ๋ฌผ์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
ice = [list(map(int, input().rstrip().split())) for i in range(n)]
# ํ•œ๋ฒˆ ๋…น์€ ๋น™์‚ฐ์„ ์ž ์‹œ ์ €์žฅํ•ด์ค„ ๋ฆฌ์ŠคํŠธ
new = [[0 for i in range(m)] for i in range(n)]


# ๋น™์‚ฐ์ด ๋‘˜ ์ด์ƒ์œผ๋กœ ๋‚˜๋ˆ„์–ด์กŒ๋Š”์ง€ ํƒ์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜
def dfs(x,y):
    if x <= -1 or y <= -1 or x >= n or y >= m: 
        return False
    if ice[x][y] >0: # ๋ฐ”๋‹ท๋ฌผ์ด ์•„๋‹Œ ๋น™์‚ฐ์ด๋ผ๋ฉด
        ice[x][y] = 0 # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        # ์ƒํ•˜์ขŒ์šฐ๋กœ DFS ๋Œ๋ฆฐ๋‹ค.
        dfs(x,y-1) 
        dfs(x,y+1)
        dfs(x+1,y)
        dfs(x-1,y)
        return True
    return False
    
year = 0 # ์—ฐ๋„ ์นด์šดํŠธ

while True:
    no = 0 # ๋‘˜ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์ง€์ง€ ์•Š๊ณ  ์ „๋ถ€ ๋…น๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
    for i in range(n): 
        for j in range(m):
            if ice[i][j] > 0: # ์–ผ์Œ์ด๋ผ๋ฉด
                cnt = 0
                for k in range(4):
                	# ์ƒํ•˜์ขŒ์šฐ ๋„ค๊ตฐ๋ฐ๊ฐ€ ์–ผ์Œ์ธ์ง€ ๋ฐ”๋‹ท๋ฌผ์ธ์ง€ ์ฒดํฌ
                    nx = i + dx[k]
                    ny = j + dy[k]

                    if nx <= -1 or ny <= -1 or nx >= n or ny >= m: # ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์ปจํ‹ฐ๋‰ด
                        continue

                    if ice[nx][ny] == 0: # ๋ฐ”๋‹ท๋ฌผ์ด๋ผ๋ฉด ์นด์šดํŠธ ์˜ฌ๋ ค์คŒ
                        cnt += 1
                # ์ด์ œ ํ˜„์žฌ ๋น™์‚ฐ์„ ๋…น์—ฌ์ค€๋‹ค.
                # if ๋ฌธ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์Œ์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ
                if ice[i][j] - cnt >= 0:
                    new[i][j] = ice[i][j] - cnt
                else:
                    new[i][j] = 0
            else: # ๋ฐ”๋‹ท๋ฌผ์ด๋ผ๋ฉด
                no += 1 # no ์นด์šดํŠธ๋ฅผ ์˜ฌ๋ ค์ฃผ๊ณ 
    # ์ „๋ถ€ ๋ฐ”๋‹ท๋ฌผ์ด๋ผ๋ฉด 0 ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if no == n*m: 
        print(0)
        break
	# ๋‘˜๋กœ ์ชผ๊ฐœ์กŒ๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด DFS ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    result = 0
    for i in range(n):
        for j in range(m):
            if dfs(i,j) == True:
                result += 1
    if result >= 2: # ๋‘˜ ์ด์ƒ ์ชผ๊ฐœ์กŒ๋‹ค๋ฉด year ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
        print(year)
        break
    year += 1

	# ๋น™์‚ฐ ์ •๋ณด ์—…๋ฐ์ดํŠธ
    ice = new
    new = [[0 for i in range(m)] for i in range(n)]

 

 

๋น™์‚ฐ

๐Ÿ”— ๋ฌธ์ œ๋งํฌ : ๋น™์‚ฐ

 

2573๋ฒˆ: ๋น™์‚ฐ

์ฒซ ์ค„์—๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N๊ณผ M์ด ํ•œ ๊ฐœ์˜ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 3 ์ด์ƒ 300 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์„

www.acmicpc.net