[Baekjoon/๐ŸฅˆSilverโ…ก] 4963: ์„ฌ์˜ ๊ฐœ์ˆ˜

2 ๋ถ„ ์†Œ์š”

Intro

๋ฌธ์ œ์‚ฌ์ง„ ๋ฌธ์ œ์‚ฌ์ง„

์ ‘๊ทผ ๋ฐฉ๋ฒ•๐Ÿ™‹โ€โ™€๏ธ

  • ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ์ƒํ•˜์ขŒ์šฐ๋งŒ์ด ์•„๋‹Œ ๋Œ€๊ฐ์„ ๊นŒ์ง€ ํฌํ•จํ•ด bfs, dfs๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ํ–‰๋ ฌ๋กœ ์ฃผ์–ด์ง€๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๋Œ€๊ฐ์„ , ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๋ฐฐ์—ด๋“ค์ด ํ•„์š”ํ•˜๋‹ค.

    • dx = [-1, 0, 1, -1, 1, -1, 0, 1]
    • dy = [-1, -1, -1, 0, 0, 1, 1, 1] ๋ฐฐ์—ด์‚ฌ์ง„

Algoritm๐Ÿ‘ฉโ€๐Ÿ’ป: BFS

  • ์šฐ์„  BFS๋ฅผ ์ ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž.
# 21.01.10
# 4963: ์„ฌ์˜ ๊ฐœ์ˆ˜

import sys

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

def bfs(i, j):
  lst[i][j] = 0
  queue = [[i, j]]
  while queue:
    a, b = queue[0][0], queue[0][1]
    del queue[0]
    for k in range(8):
      x = a + dx[k]
      y = b + dy[k]
      if 0 <= x < h and 0 <= y < w and lst[x][y] == 1:
        lst[x][y] = 0
        queue.append([x, y])

      

while 1:
  w, h = map(int, sys.stdin.readline().rstrip().split())
  if w == 0 and h == 0:
    break

  lst = []
  for i in range(h):
    lst.append(list(map(int, sys.stdin.readline().rstrip().split())))

  cnt = 0
  for i in range(h):
    for j in range(w):
      if lst[i][j] == 1:
        bfs(i, j)
        cnt += 1

  print(cnt)
  
  • ๋ชจ๋“  ํ–‰๋ ฌ์„ ๋Œ๋ฉฐ 1์ธ ์š”์†Œ์— ๋Œ€ํ•ด์„œ BFS๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • BFS ํ•จ์ˆ˜์—์„œ๋Š” ํ•ด๋‹น ์š”์†Œ์˜ ๋Œ€๊ฐ์„ , ์ƒํ•˜์ขŒ์šฐ์— ์กด์žฌํ•˜๋Š” ์š”์†Œ๋“ค ์ค‘ ๊ฐ’์ด 1์ธ ์š”์†Œ๋“ค์„ ์ฐจ๋ก€๋กœ queue์— ๋„ฃ์œผ๋ฉด์„œ ๊ทธ ๊ฐ’๋“ค์„ 0์œผ๋กœ ๋ฐ”๊พผ๋‹ค.

    • 1์ธ ์š”์†Œ์˜ ๋Œ€๊ฐ์„ , ์ƒํ•˜์ขŒ์šฐ์— ์žˆ๋Š” ๊ฐ’์ด 1์ธ ์š”์†Œ๋“ค์€ ํ•˜๋‚˜์˜ ์„ฌ์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    • BFS์—์„œ ๋ฐ˜ํ™˜๋œ ํ›„, ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.

  • ๋ชจ๋“  ์š”์†Œ๋“ค์„ ์ˆœํ™˜ํ•œ ํ›„, ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

Algoritm๐Ÿ‘ฉโ€๐Ÿ’ป: DFS

  • ์ด๋ฒˆ์—๋Š” ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ DFS๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•ด๋ณด์ž.
# 21.01.10
# 4963: ์„ฌ์˜ ๊ฐœ์ˆ˜

import sys
sys.setrecursionlimit(10000)

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

def dfs(i, j):
  lst[i][j] = 0
  for k in range(8):
    x = i + dx[k]
    y = j + dy[k]
    if 0 <= x < h and 0 <= y < w and lst[x][y] == 1:
      dfs(x, y)

      

while 1:
  w, h = map(int, sys.stdin.readline().rstrip().split())
  if w == 0 and h == 0:
    break

  lst = []
  for i in range(h):
    lst.append(list(map(int, sys.stdin.readline().rstrip().split())))

  cnt = 0
  for i in range(h):
    for j in range(w):
      if lst[i][j] == 1:
        dfs(i, j)
        cnt += 1

  print(cnt)

โ†’ ์ž ๊น๐Ÿ””: โ€˜sys.setrecursionlimit(10000)โ€™

  • ํŒŒ์ด์ฌ์€ ๊ธฐ๋ณธ ์žฌ๊ท€ ๊นŠ์ด ์ œํ•œ์ด 1000์œผ๋กœ ๋งค์šฐ ์–‡๋‹ค.
  • ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด ํ‘ธ๋Š” ๋ฌธ์ œ์ผ ๊ฒฝ์šฐ, ์œ„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์žฌ๊ท€ ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค!!

  • ๋ชจ๋“  ํ–‰๋ ฌ์„ ๋Œ๋ฉฐ 1์ธ ์š”์†Œ์— ๋Œ€ํ•ด์„œ DFS๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • DFS ํ•จ์ˆ˜์—์„œ๋Š” ํ•ด๋‹น ์š”์†Œ์˜ ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊พผ ํ›„, ๋Œ€๊ฐ์„ ๊ณผ ์ƒํ•˜์ขŒ์šฐ์— ์žˆ๋Š” ์š”์†Œ๋“ค ์ค‘ ๊ฐ’์ด 1์ธ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด์„œ DFS๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœํ•œ๋‹ค.

  • ๋ชจ๋“  ์š”์†Œ๋“ค์„ ์ˆœํ™˜ํ•œ ํ›„, ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ฐธ๊ณ ๐Ÿ“ƒ

๊ทธ๋Ÿผ!! ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์—ฌ๊ธฐ์„œ!

๋!! ~(ห˜โ–พห˜~)

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