๋ฌธ์ œ

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ ย ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์—ย ํšจ๊ณผ์ ์ธ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๋ฅผ ๊ตฌ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•œ๋‹ค. ์ด ์ง€๋ ์ด๋Š” ๋ฐฐ์ถ”๊ทผ์ฒ˜์— ์„œ์‹ํ•˜๋ฉฐ ํ•ด์ถฉ์„ ์žก์•„ย ๋จน์Œ์œผ๋กœ์จ ๋ฐฐ์ถ”๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. ํŠนํžˆ, ์–ด๋–ค ๋ฐฐ์ถ”์— ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋ผ๋„ ์‚ด๊ณ  ์žˆ์œผ๋ฉด ์ด ์ง€๋ ์ด๋Š” ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ฐฐ์ถ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด, ๊ทธ ๋ฐฐ์ถ”๋“ค ์—ญ์‹œ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฐฐ์ถ”์˜ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์— ๋‹ค๋ฅธ ๋ฐฐ์ถ”๊ฐ€ ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์— ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ๋‚˜๊ฐ€ ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋Š” ๋•…์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•ด์„œ ๋ฐฐ์ถ”๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์‹ฌ์–ด ๋†“์•˜๋‹ค. ๋ฐฐ์ถ”๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์—๋Š” ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋ฐฐ์ถ”๋“ค์ด ๋ช‡ ๊ตฐ๋ฐ์— ํผ์ ธ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ด ๋ช‡ ๋งˆ๋ฆฌ์˜ ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์ถ”๋ฐญ์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์†Œ 5๋งˆ๋ฆฌ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 0์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ์ง€ ์•Š์€ ๋•…์ด๊ณ , 1์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ๋•…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

1012๋ฒˆ: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

1 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 1 1 0 0 0 1 1 1
0 0 0 0 1 0 0 1 1 1

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒซ์งธ ์ค„์—๋Š” ๋ฐฐ์ถ”๋ฅผ ์‹ฌ์€ ๋ฐฐ์ถ”๋ฐญ์˜ ๊ฐ€๋กœ๊ธธ์ด M(1 โ‰ค M โ‰ค 50)๊ณผ ์„ธ๋กœ๊ธธ์ด N(1 โ‰ค N โ‰ค 50), ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜ K(1 โ‰ค K โ‰ค 2500)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ๋ฐฐ์ถ”์˜ ์œ„์น˜ X(0 โ‰ค X โ‰ค M-1), Y(0 โ‰ค Y โ‰ค N-1)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฐฐ์ถ”์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ๋งˆ๋ฆฌ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋‹ค๊ฐ€ ์ง€๋ ์ด๋ฅผ ํ•œ ๋งˆ๋ฆฌ์”ฉ ๋ฟŒ๋ฆฌ๊ณ  ์ง€๋ ์ด๊ฐ€ ๋จน์ด๋ฅผ ๋‹ค ๋จน์œผ๋ฉด ๋‹ค์Œ์œผ๋กœ ๋ฐœ๊ฒฌ๋œ 1์—์„œ ๋‹ค์‹œ ์ง€๋ ์ด๋ฅผ ๋†“๊ณ  ๋จน์ด๋ฅผ ๋จน์ด๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ง€๋ ์ด๊ฐ€ ๋จน์ด๋ฅผ ๋จน๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒํ•˜์ขŒ์šฐ์— ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋ฟŒ๋ฆฌ๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ž˜ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ์ธ๋ฐ ์žฌ๊ท€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ๋ณด๋‹ˆ ๋ฐฑ์ค€์—์„  ์žฌ๊ท€ ์ œํ•œ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์žฌ๊ท€ ์ œํ•œ์„ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์„ ์จ์•ผ ์žฌ๊ท€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ๊ท€๊ฐ€ ์žฌ๊ท€๋ฅผ ๋ถˆ๋Ÿฌ์„œ ์žฌ๊ท€๊ฐ€ ๋‹ค๋ฅธ ์žฌ๊ท€๋ฅผ ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๊นŒ์ง€ ์žฌ๊ท€์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์ถ”๊ฐ€ ์ด์–ด์ง„ ๋๊นŒ์ง€ ๋“ค์–ด๊ฐ€์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

import sys
sys.setrecursionlimit(10**6)#์žฌ๊ท€ ์ œํ•œ ํ’€๊ธฐ

def eat(field_arr, x, y):
    # ๋ฐญ์„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฐฐ์ถ”๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ด๋ฏธ ๋จน์€ ๊ณณ(0์ธ ๊ณณ) ๋งŒ๋‚˜๋ฉด ๋๋‚จ.
    if y < 0 or y >= len(field_arr) or x < 0 or x >= len(field_arr[0]) or field_arr[y][x] == 0:
        return

    # ๋จน์€ ๊ณณ์„ 0์œผ๋กœ ํ‘œ์‹œ
    field_arr[y][x] = 0

    # ์•„๊ธฐ ์ง€๋ ์ด๋ฅผ ์‚ฌ๋ฐฉ์— ๋ฟŒ๋ฆฌ๊ธฐ
    eat(field_arr, x, y + 1)
    eat(field_arr, x, y - 1)
    eat(field_arr, x + 1, y)
    eat(field_arr, x - 1, y)

def count_worms(field):#๋ฐฐ์ถ”๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋จน์ด๊ณ  ๋‹ค ๋จน์œผ๋ฉด ๋‹ค์‹œ ๋ฐฐ์ถ”์ฐพ๊ธฐ
    if not field:
        return 0
    count = 0 
    for y in range(len(field)):
        for x in range(len(field[0])):
            if field[y][x] == 1:
                eat(field, x, y)
                count += 1
    return count # ๋ช‡ ๋ฒˆ๋จน์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ธฐ 

T = int(sys.stdin.readline())
for i in range(T):
    M, N, K = map(int, sys.stdin.readline().split())
    field = [[0 for _ in range(M)] for _ in range(N)]
    for xy in range(K):
        x, y = map(int, sys.stdin.readline().split())
        field[y][x] = 1
    # ์ง€๋ ์ด ์ˆ˜ ๊ณ„์‚ฐ
    print(count_worms(field))

์žฌ๊ท€ ์˜ค๋ฅ˜ ์—†์ด ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ํ•ด์•ผ ํ•  ์ผ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ธฐ์–ตํ•˜๋Š” ํ๋กœ ์ž‘์—… ๋Œ€๊ธฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค.

import sys
from collections import deque

def bfs_eat(field_arr, start_x, start_y):
    queue = deque([(start_x, start_y)])

    while queue:
        x, y = queue.popleft()#ํ์—์„œ ๋จน์ด์ขŒํ‘œ ๊บผ๋‚ด๊ธฐ
        # ํ˜„์žฌ ์œ„์น˜์—์„œ ์‚ฌ๋ฐฉ ํƒ์ƒ‰
        for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
            nx, ny = x + dx, y + dy
            # ๋ฐญ์„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฐฐ์ถ”๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ด๋ฏธ ๋จน์€ ๊ณณ(0์ธ ๊ณณ) ๋งŒ๋‚˜๋ฉด ๋ฌด์‹œ
            if ny < 0 or ny >= len(field_arr) or nx < 0 or nx >= len(field_arr[0]) or field_arr[ny][nx] == 0:
                continue
            # ๋จน์€ ๊ณณ์„ 0์œผ๋กœ ํ‘œ์‹œ
            field_arr[ny][nx] = 0
            queue.append((nx, ny))#์ƒˆ๋กœ ๋งŒ๋‚œ ๊ณณ์„ ์ž‘์—… ํ์— ๋„ฃ๊ธฐ

def count_worms(field):
    if not field:
        return 0
    count = 0
    for y in range(len(field)):
        for x in range(len(field[0])):
            if field[y][x] == 1:
                bfs_eat(field, x, y)
                count += 1
    return count

T = int(sys.stdin.readline())
for i in range(T):
    M, N, K = map(int, sys.stdin.readline().split())
    field = [[0 for _ in range(M)] for _ in range(N)]
    for xy in range(K):
        x, y = map(int, sys.stdin.readline().split())
        field[y][x] = 1
    # ์ง€๋ ์ด ์ˆ˜ ๊ณ„์‚ฐ
    print(count_worms(field))

DFS๋Š” ์Šคํƒ์ด๋‚˜ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ˜๋ฉด, BFS๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์Šคํƒ๊ณผ ํ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œโ€ฆ.

์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„ in Python

์„ ๊ณต๋ถ€ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‘์šฉ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ํ’€์–ด๋ณด์•˜๋‹ค.

from collections import deque

def ripe_days(M, N, box):
    movements = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # ์ƒ, ํ•˜, ์ขŒ, ์šฐ
    queue = deque()
    total_tomatoes = 0
    riped_tomatoes = 0

    # ์ดˆ๊ธฐ ์ต์€ ํ† ๋งˆํ† ์˜ ์œ„์น˜๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ , ํ† ๋งˆํ† ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
    for i in range(N):
        for j in range(M):
            if box[i][j] == 1:
                queue.append((i, j))
                riped_tomatoes += 1
            if box[i][j] != -1:
                total_tomatoes += 1

    days = 0
    while queue:#๋ช‡ ์ผ์ด ์ง€๋‚ฌ๋‚˜ ์‚ดํŽด๋ณผ๊นŒ์š”?
        for _ in range(len(queue)):
            x, y = queue.popleft()
            for dx, dy in movements:
                nx, ny = x + dx, y + dy
                if 0 <= nx < N and 0 <= ny < M and box[nx][ny] == 0:
                    box[nx][ny] = 1
                    riped_tomatoes += 1
                    queue.append((nx, ny))
        days += 1

    if riped_tomatoes == total_tomatoes:
        return days - 1  # ๋งˆ์ง€๋ง‰ ๋‚ ์—๋Š” ์ถ”๊ฐ€ ์ต์€ ํ† ๋งˆํ† ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•˜๋ฃจ๋ฅผ ๋นผ์คŒ
    else:
        return -1  # ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ
    
import sys
M,N=map(int,input().split())
box = [[int(x) for x in y.split()] for y in sys.stdin.readlines()]
if sum([sum([z**2 for z in line])for line in box])==M*N:
    print(0)
else:
    print(ripe_days(M, N, box))

์ฝ”๋“œ ๋ถ„์„

  1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ:
  2. ripe_daysย ํ•จ์ˆ˜: