๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 1303 - ์ „์Ÿ - ์ „ํˆฌ(BFS)

by YWTechIT 2021. 4. 21.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 1303 - ์ „์Ÿ - ์ „ํˆฌ

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

(์—ฌ๋‹ด์ด์ง€๋งŒ 1303 ํ•˜๋‹ˆ๊นŒ ๊ตญ๋ฐฉ ํ—ฌํ”„์ฝœ์ด ์ƒ๊ฐ๋‚ฌ๋‹ค.)

 

2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์ƒ‰๊น”์— ๋งž๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์ „ํ˜•์ ์ธ BFS๋ฌธ์ œ์ด์ง€๋งŒ, ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•˜๋‹ค. ํ•œ์ชฝ BFS๋งŒ ๊ตฌํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ์–‘์ชฝ BFS๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•˜๋Š”์ง€ ๊ต‰์žฅํžˆ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค.


๊ฒฐ๋ก ์ ์œผ๋กœ BFS ํ•จ์ˆ˜์— color๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž‘์„ฑํ•ด์„œ ๋„˜๊ฒจ์คฌ๊ณ  ํ•จ์ˆ˜๋‚ด์—์„œ ๊ฐ ์นธ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ ์ƒ‰๊น”๋ณ„๋กœ w_cnt, b_cnt๋ฅผ ๋”ฐ๋กœ๋”ฐ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  cnt ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•ด์„œ ์ƒ‰๊น” ๋ณ„๋กœ ์กฐ๊ฑด๋ฌธ์„ ๋‹ค๋ฅด๊ฒŒ ์ฃผ์–ด ํ˜„์žฌ ๋“ค์–ด์˜จ ์ƒ‰์„ ๊ธฐ์ค€์œผ๋กœ cnt๋ฅผ ์„ธ๊ณ  returnํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•๊นŒ์ง€ ์บ์น˜ํ•˜๋Š”๋ฐ ์ƒ๋‹นํžˆ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์–ด์ œ ์ฒซ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋กœ ์„ ์ •ํ–ˆ์œผ๋‚˜, ๋‹น์‹œ์—๋Š” ํ’€์ง€ ๋ชปํ–ˆ๊ณ  ์ดํ›„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋จธ๋ฆฟ์†์— ๋„ฃ๊ณ  ์‹ถ์–ด ์˜ค๋Š˜ 21์‹œ๊นŒ์ง€ ๋ฏธ๋ค„๋’€๋‹ค๊ฐ€ ๋‹ค์‹œ ํ’€์—ˆ๋‹ค.

 

BFS์˜ ๊ตฌํ˜„๋ฐฉ๋ฒ•์„ ์•Œ๋”๋ผ๋„ ๋ฌธ์ œ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ์„œ ์ž…๋ ฅ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ํ’€์—ˆ๋˜ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ •์„์ ์ธ BFS ๊ตฌํ˜„: boj_1260 - DFS์™€ BFS
  2. ๊ฐ๊ฐ์˜ ๊ธฐ์ค€์  ๋ณ„ ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ: boj_2667 - ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ, boj_1303 - ์ „์Ÿ - ์ „ํˆฌ
  3. ์‹œ์ž‘ ์ง€์ ์ด 2๊ณณ ์ด์ƒ์ธ ์ขŒํ‘œ๋ฅผ ๋™์‹œ์— BFS ๊ตฌํ˜„: boj_7576 - ํ† ๋งˆํ† 
  4. ํ•œ ๊ธฐ์ค€์ ์ด ๋‹ค๋ฅธ ๊ธฐ์ค€์ ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” BFS: boj_4179 - ๋ถˆ!
  5. ๋ฒ”์œ„๋ณ„ ์ตœ๋Œ€ BFS ๊ตฌํ•˜๊ธฐ: boj_2468 - ์•ˆ์ „ ์˜์—ญ
  6. ๋“ฑ๋“ฑ...
728x90

๋งŽ์ด ํ’€์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ ์–ด๋–ค ๋ฌธ์ œ๋Š” ํ’€์—ˆ๋˜ ๋ฌธ์ œ ๊ฐ™๊ณ  ๋ฐ˜๋Œ€๋กœ ์–ด๋–ค ๋น„์Šทํ•œ ๋ฌธ์ œ๋Š” ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋‹ค. ํ๋ฆ„์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  BFS ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์—„์ฒญ๋งŽ์•˜๋‹ค. ์ฒ™ ๋ณด๋ฉด ์ด๋Ÿฐ ์œ ํ˜•์ด๊ตฌ๋‚˜๋ฅผ ์•Œ ๋•Œ๊นŒ์ง€ ํ’€์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

ํ’€์ด ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž.

 

  1. ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ด ์—†๊ณ  ํ˜„์žฌ ๊ฐ’์ด W์ธ ๊ฐ’ ํ˜น์€ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ด ์—†๊ณ  ํ˜„์žฌ ๊ฐ’์ด B์ธ ๊ฐ’์„ ํ•จ์ˆ˜๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  2. color๋ณ„๋กœ cnt๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  3. return cnt+1 ํ•œ ๊ฐ’์— ์ œ๊ณฑํ•ด์ฃผ๊ณ  ์ƒ‰๊น”๋ณ„๋กœ ๋ˆ„์ ์‹œํ‚จ๋‹ค.

 

import sys
from collections import deque
input = sys.stdin.readline

def bfs(x, y, color):
    cnt = 0
    queue = deque()
    queue.append((x, y))
    visited[x][y] = True

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < m and 0 <= ny < n:
                if graph[nx][ny] == color and not visited[nx][ny]:    # each color check
                    visited[nx][ny] = True
                    queue.append((nx, ny))
                    cnt += 1    # each color count

    return cnt + 1

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
n, m = map(int, input().split())
graph = [list(input()) for _ in range(m)]
visited = [[False] * n for i in range(m)]

white, blue = 0, 0
for i in range(m):
    for j in range(n):
        if graph[i][j] == 'W' and not visited[i][j]:
            white += bfs(i, j, 'W') ** 2    # count accumulate
        elif graph[i][j] == 'B' and not visited[i][j] :
            blue += bfs(i, j, 'B') ** 2    # count accumulate

print(white, blue)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€