[BOJ][๐ŸŸก4][๋ฐฑ์ค€#02573] ๋น™์‚ฐ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #2573


๋ฌธ์ œ

์ง€๊ตฌ ์˜จ๋‚œํ™”๋กœ ์ธํ•˜์—ฌ ๋ถ๊ทน์˜ ๋น™์‚ฐ์ด ๋…น๊ณ  ์žˆ๋‹ค. ๋น™์‚ฐ์„ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด 2์ฐจ์› ๋ฐฐ์—ด์— ํ‘œ์‹œํ•œ๋‹ค๊ณ  ํ•˜์ž. ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„๋ณ„ ๋†’์ด ์ •๋ณด๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์— ์–‘์˜ ์ •์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค. ๋น™์‚ฐ ์ด์™ธ์˜ ๋ฐ”๋‹ค์— ํ•ด๋‹น๋˜๋Š” ์นธ์—๋Š” 0์ด ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ฆผ 1์—์„œ ๋นˆ์นธ์€ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ย  ย  ย  ย  ย  ย  ย 

ย  2 4 5 3 ย  ย 

ย  3 ย  2 5 2 ย 

ย  7 6 2 4 ย  ย 

ย  ย  ย  ย  ย  ย  ย 

๊ทธ๋ฆผ 1. ํ–‰์˜ ๊ฐœ์ˆ˜๊ฐ€ 5์ด๊ณ  ์—ด์˜ ๊ฐœ์ˆ˜๊ฐ€ 7์ธ 2์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋น™์‚ฐ์˜ ๋†’์ด ์ •๋ณด ๋น™์‚ฐ์˜ ๋†’์ด๋Š” ๋ฐ”๋‹ท๋ฌผ์— ๋งŽ์ด ์ ‘ํ•ด์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ๋” ๋นจ๋ฆฌ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์—์„œ ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ์นธ์— ์žˆ๋Š” ๋†’์ด๋Š” ์ผ๋…„๋งˆ๋‹ค ๊ทธ ์นธ์— ๋™์„œ๋‚จ๋ถ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด์žˆ๋Š” 0์ด ์ €์žฅ๋œ ์นธ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ค„์–ด๋“ ๋‹ค. ๋‹จ, ๊ฐ ์นธ์— ์ €์žฅ๋œ ๋†’์ด๋Š” 0๋ณด๋‹ค ๋” ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋ฐ”๋‹ท๋ฌผ์€ ํ˜ธ์ˆ˜์ฒ˜๋Ÿผ ๋น™์‚ฐ์— ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์€ ์ผ๋…„ํ›„์— ๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ๋ณ€ํ˜•๋œ๋‹ค. ๊ทธ๋ฆผ 3์€ ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์ด 2๋…„ ํ›„์— ๋ณ€ํ•œ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋™์„œ๋‚จ๋ถ ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด์žˆ๋Š” ์นธ๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ 2์˜ ๋น™์‚ฐ์€ ํ•œ ๋ฉ์–ด๋ฆฌ์ด์ง€๋งŒ, ๊ทธ๋ฆผ 3์˜ ๋น™์‚ฐ์€ ์„ธ ๋ฉ์–ด๋ฆฌ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค.

ย  ย  ย  ย  ย  ย  ย 

ย  ย  2 4 1 ย  ย 

ย  1 ย  1 5 ย  ย 

ย  5 4 1 2 ย  ย 

ย  ย  ย  ย  ย  ย  ย 

๊ทธ๋ฆผ 2

ย  ย  ย  ย  ย  ย  ย 

ย  ย  ย  3 ย  ย  ย 

ย  ย  ย  ย  4 ย  ย 

ย  3 2 ย  ย  ย  ย 

ย  ย  ย  ย  ย  ย  ย 

๊ทธ๋ฆผ 3 ํ•œ ๋ฉ์–ด๋ฆฌ์˜ ๋น™์‚ฐ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๋น™์‚ฐ์ด ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์— ๋Œ€ํ•ด์„œ๋Š” 2๊ฐ€ ๋‹ต์ด๋‹ค. ๋งŒ์ผ ์ „๋ถ€ ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


์ž…๋ ฅ

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


์ถœ๋ ฅ

์ฒซ ์ค„์— ๋น™์‚ฐ์ด ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์ผ ๋น™์‚ฐ์ด ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

5 7
0 0 0 0 0 0 0
0 2 4 5 3 0 0
0 3 0 2 5 2 0
0 7 6 2 4 0 0
0 0 0 0 0 0 0


์ถœ๋ ฅ

2


My Sol

import sys
input = sys.stdin.readline

def main():
    def check_ices():
        ices = set()
        for i in range(I):
            for j in range(J):
                if mat[i][j]:
                    ices.add((i, j))
        return ices

    def check_is_one():
        ii, ij = ices.pop()
        ices.add((ii, ij))
        linked_ices = check_linked(ii, ij)
        return linked_ices == ices

    def check_linked(ii, ij):
        linked_ices = set()
        Q = set()
        Q.add((ii, ij))
        while Q:
            ii, ij = Q.pop()
            if (ii, ij) in linked_ices: continue
            linked_ices.add((ii, ij))
            for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
                si, sj = ii+di, ij+dj
                if not (0<=si<I and 0<=sj<J): continue
                if not mat[si][sj]: continue
                Q.add((si, sj))
        return linked_ices

    def melt():
        target_ices = []
        for ii, ij in ices:
            melt_cnt = melt_one(ii, ij)
            target_ices.append((ii, ij, melt_cnt))

        remove_ices = set()
        for ii, ij, mcnt in target_ices:
            mat[ii][ij] -= mcnt
            if mat[ii][ij]: continue
            remove_ices.add((ii, ij))
        return remove_ices

    def melt_one(i, j):
        cnt = 0
        for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
            si, sj = i+di, j+dj
            if not (0<=si<I and 0<=sj<J): continue
            if mat[si][sj]: continue
            cnt += 1
        return cnt if mat[i][j] > cnt else mat[i][j]


    I, J = map(int, input().split())
    mat = [list(map(int, input().split())) for _ in range(I)]
    ices = check_ices()
    if not ices: return 0

    year = 0
    while True:
        if not check_is_one(): return year
        year += 1
        ices -= melt()
        if not ices: return 0

print(main())

BFS ๋˜๋Š” DFS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋‚˜๋Š” BFS๋ฅผ ํ™œ์šฉํ•˜์˜€์œผ๋ฉฐ, 7๋‹ฌ~8๋‹ฌ ์ „์— ๋ชป ํ’€์—ˆ๋˜ ๋ฌธ์ œ์—ฌ์„œ ์žฌ๋„์ „ํ•œ ๊ฑด๋ฐ ์‰ฝ๊ฒŒ ์ž˜ ํ’€์–ด๋‚ด์„œ ๊ธฐ์˜๋‹ค.

  1. main ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. ๊ฐ€๋กœ ์„ธ๋กœ์˜ ํฌ๊ธฐ I, J์™€ ํ•ด๋‹นํ•˜๋Š” ๋น™์‚ฐ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฒฉ์ž mat์„ ๋ฐ›์•„ ์ €์žฅํ•˜๊ณ , ์–ผ์Œ์ด ์žˆ๋Š” ๊ฐ ์ขŒํ‘œ๋“ค์„ ices๋ผ๋Š” set์— ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค. ์ด๋ฅผ make_ices ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.
  2. ๋งŒ์•ฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ์–ผ์Œ์ด ์—†๋‹ค๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. ์—ฐ๋„๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ง€ํ‘œ year๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  4. ๋น™์‚ฐ๋“ค์ด ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ์ธ์ง€ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜ check_is_one์„ ์ž‘์„ฑํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ices set์˜ ์–ผ์Œ ์ขŒํ‘œ ํ•˜๋‚˜๋ฅผ ๋ฝ‘์•„ mat์œผ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ขŒํ‘œ๋“ค์„ BFS๋ฅผ ํ™œ์šฉํ•ด set์— ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ check_linked๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋œ linked_ices์™€ ๊ฐ™์€์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์ด ๊ฐ™๋‹ค๋ฉด ๋ชจ๋“  ์–ผ์Œ์ด ํ•˜๋‚˜, ์•„๋‹ˆ๋ผ๋ฉด ๋ชจ๋“  ์–ผ์Œ์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ง์ด ๋œ๋‹ค.
  5. ๋งŒ์•ฝ check_is_one ํ•จ์ˆ˜๊ฐ€ False๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด main ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ์‹œ์ ์˜ year ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.
  6. ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด 1๋…„์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋น™์‚ฐ์„ ๋…น์ด๋Š” meltํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๋™์‹œ์— year์€ 1 ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. melt ํ•จ์ˆ˜๋Š” ices set์˜ ๊ฐ ์–ผ์Œ๋“ค์˜ ์ขŒํ‘œ ์ฃผ๋ณ€ ์‚ฌ๋ฐฉ์„ ํ™•์ธํ•˜์—ฌ ๋ฐ”๋‹ค์™€ ๋งž๋‹ฟ๋Š” ์ขŒํ‘œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•œ๋‹ค. ์ด ์ •๋ณด๋ฅผ ๋ชจ๋‘ target_ices์— ๋„ฃ์–ด ๋‚˜์ค‘์— ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค.
  7. ์ด ๊ณผ์ •์—์„œ ํ•˜๋‚˜์˜ ์–ผ์Œ์˜ ์ฃผ๋ณ€์„ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜ melt_one์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ ๋‹จ์ˆœํžˆ ์ฃผ๋ณ€์˜ ๋ฐ”๋‹ค ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ, ์–ผ์Œ ์ž์ฒด์˜ ์–‘์„ ๋„˜๋Š”์ง€๊นŒ์ง€ ํ™•์ธํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด melt ํ•จ์ˆ˜์—์„œ ์ด๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉฐ mat์—์„œ ์–ผ์Œ์˜ ๊ฐ’์„ ์ค„์—ฌ์ฃผ๋Š”๋ฐ, ํ•ด๋‹น ์ขŒํ‘œ๋ณด๋‹ค ๋” ํฐ ๊ฐ’์„ ๋นผ๊ฒŒ ๋˜๋ฉด 0์ด ์•„๋‹ˆ๊ฒŒ ๋˜์–ด ์ถ”ํ›„์— ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ์—์„œ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  8. melt ํ•จ์ˆ˜์—์„œ ์–ผ์Œ์„ ๋…น์ผ ๋•Œ ๋…น์•„ 0์ด ๋˜๋Š” ์ขŒํ‘œ๋“ค์„ remove_ices set์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. main ํ•จ์ˆ˜์—์„œ๋Š” ์ด remove_ices๋ฅผ ices set์—์„œ ๋นผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ices set์ด ๋น„๊ฒŒ ๋˜๋ฉด ํ•œ ๋ฒˆ์˜ melt๋กœ ํ•œ ๋ฉ์–ด๋ฆฌ์˜ ์–ผ์Œ์ด ๋ชจ๋‘ ์—†์–ด์ง€๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  9. main ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ