๐Ÿงฉ Algorithm/[BOJ] Gold

BOJ 10026๋ฒˆ : ์ ๋ก ์ƒ‰์•ฝ (Python/Gold 5)

devCloud 2023. 5. 14. 18:43
728x90
 

10026๋ฒˆ: ์ ๋ก์ƒ‰์•ฝ

์ ๋ก์ƒ‰์•ฝ์€ ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋А๋ผ์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ์€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก)

www.acmicpc.net


์„ค๋ช…

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํฌ๊ธฐ๊ฐ€ 5x5์ธ ๊ทธ๋ฆฌ๋“œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž. R์€ ๋นจ๊ฐ„์ƒ‰, B๋Š” ํŒŒ๋ž€์ƒ‰, G๋Š” ์ดˆ๋ก์ƒ‰์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ์ƒ‰๋ผ๋ฆฌ ์ธ์ ‘ํ•ด ์žˆ์œผ๋ฉด ๊ทธ๊ฑด ํ•˜๋‚˜์˜ ๊ตฌ์—ญ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์™€ ์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ๋Š” ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•ด์„œ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ๊ตฌ์—ญ์„ ๊ตฌํ•ด๋ณด์ž. ์•„๋ž˜๋Š” ๊ตฌ์—ญ์„ ์ƒ‰๊น”๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ตฌ์—ญ์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๋“œ ์•ˆ์— ๊ฒ€์€์ƒ‰ ์„ ์€ ๊ตฌ์—ญ์„ ๋‚˜๋ˆˆ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๊ตฌ์—ญ์ด ์ด 4๊ฐœ(๋นจ2, ์ดˆ1, ํŒŒ1)๋กœ๋‚˜๋ˆ ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ๋Š” ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์ด ๊ตฌ๋ถ„์ด ์—†์–ด์ ธ์„œ ๊ตฌ์—ญ์ด ์ด 3๊ฐœ(๋นจ2, ํŒŒ1)๋กœ ๋‚˜๋ˆ ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (ํ•„์ž๋Š” ์ดˆ๋ก์ƒ‰์„ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์น ํ–ˆ๋‹ค.) 

 

ํ’€์ด

โœ” BFS/DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ

1. ํŒŒ์ด์ฌ์—์„œ BFS/DFS๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ/์Šคํƒ์ด ํ•„์š”ํ•˜๋‹ค. ํ์™€ ์Šคํƒ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฑ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

from collections import deque
import sys
input = sys.stdin.readline #์ž…์ถœ๋ ฅ ํ–ฅ์ƒ

2. ๊ทธ๋ฆฌ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ dx, dy ์ƒ์„ฑ

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. (ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•ด๋„ ๋˜์ง€๋งŒ ํŽธ์˜์ƒ ๋จผ์ € ์ •์˜)

๋งŒ์•ฝ 3x3 ๋ฏธ๋กœ(์ขŒ์ธก ๊ทธ๋ฆผ)๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. (0, 0)์—์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ์œ„์น˜์—์„œ ์ฃผ๋ณ€์„ ๋‹ค ํ™•์ธํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ๋Œ€๊ฐ์„ ์„ ์ œ์™ธํ•œ ์ƒํ•˜์ขŒ์šฐ๋งŒ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹ค.

ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ฉด์„œ ํ•ด์•ผ ํ•œ๋‹ค. ์ƒํ•˜์ขŒ์šฐ 4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ x, y ๋ณ€์ˆ˜์— ๊ฐ ๋„ค ๊ฐœ์˜ ๊ฐ’๋งŒ ๋„ฃ๋Š”๋‹ค. ๋งจ ์šฐ์ธก์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ขŒํ‘œ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ํ•œ ์นธ์„ ์ด๋™ํ–ˆ์„ ๋•Œ์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ dx์— x์ขŒํ‘œ๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋ฏ€๋กœ [(์ขŒ)-1, (์šฐ)1, (์ƒ)0, (ํ•˜)0], ๊ทธ๋ฆฌ๊ณ  dy์—๋Š” y์ขŒํ‘œ์ธ [(์ขŒ)0, (์šฐ)0, (์ƒ)1 (ํ•˜)-1] ์ด๋ ‡๊ฒŒ ์ €์žฅํ•œ๋‹ค. ํ•„์ž๋Š” ์ขŒ์šฐํ•˜์ƒ ์ˆœ๋Œ€๋กœ ์ €์žฅํ–ˆ์ง€๋งŒ, ๋ณธ์ธ์ด ํŽธํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค. (๋‹จ x์™€ y ๋ชจ๋‘ ์ˆœ์„œ์— ๋งž๊ฒŒ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, x๋Š” ์ขŒ์šฐํ•˜์ƒ์ธ๋ฐ y๋Š” ์ขŒ์šฐ์ƒํ•˜ ์ด๋Ÿฐ์‹์œผ๋กœ ์ €์žฅํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)

์ด๊ฑด ์•ž์œผ๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ํ•  ๋•Œ ํ•„์ˆ˜๋กœ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ธฐ์–ตํ•ด๋‘์ž.

#์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‹ค ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฑธ ์ถ”๊ฐ€ (์•„๋ž˜๋Š” ์ขŒ์šฐ์ƒํ•˜ ์ˆœ๋Œ€๋กœ ์ €์žฅ)
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]

 

3. BFS ํ˜น์€ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•œ๋‹ค.

 

3.1 BFS

def BFS(x, y):
    q = deque() #ํ ์ƒ์„ฑ
    q.append((x, y)) #ํ์— ์ดˆ๊ธฐ ์œ„์น˜ ๋„ฃ๊ธฐ
    visited[x][y] = 1 #๋ฐฉ๋ฌธ ํ‘œ์‹œ

ํŒŒ์ด์ฌ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด def๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. BFS ํ•จ์ˆ˜ ์ธ์ˆ˜์— ์ขŒํ‘œ๊ฐ’(0, 0)์„ ๋„ฃ์–ด์•ผ ํ•˜๋ฏ€๋กœ x์™€ y๋ฅผ ์“ด๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฑ์„ ์ƒ์„ฑํ•œ๋‹ค. ๋ฑ์˜ ์ด๋ฆ„์€ q๋ผ๊ณ  ์ •์˜ํ–ˆ๊ณ , ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ q์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋’ค์—์„œ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฑฐ์ง€๋งŒ, ๊ตฌ์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•  ๋•Œ ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ์„ ๋•Œ BFS ๋ฌธ์„ ๋Œ๋ฆฌ๊ณ  ๊ทธ๋•Œ๋งˆ๋‹ค ์นด์šดํŠธ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

while q:
        x, y = q.popleft()  # ๊บผ๋‚ด๊ธฐ

        # ์ขŒํ‘œ ์ด๋™ํ•˜๋ฉด์„œ ์ƒํ•˜์ขŒ์šฐ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

์ด์ œ  ์ขŒํ‘œ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉด์„œ  ๊ฐ™์€ ๊ตฌ์—ญ์— ์žˆ๋Š” ๊ฑธ ์ฐพ๋Š”๋‹ค. popleft()๋Š” ๋ฑ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฑธ ๋นผ๋‚ด๊ณ  ์‚ญ์ œํ•œ๋‹ค. ๋ฑ์— ์žˆ๋Š” ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ๊บผ๋‚ด์„œ x, y์— ์ €์žฅํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ํ˜„์žฌ ์ขŒํ‘œ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•œ๋‹ค. 

            if -1 < nx < N and -1 < ny < N: 
                if graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
                    visited[nx][ny] = 1  #๋ฐฉ๋ฌธ์ฒดํฌ ํ›„ ํ์— ๋„ฃ์Œ
                    q.append((nx, ny))

๊ทธ๋Ÿฌ๋‚˜ ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ€ ๊ทธ๋ฆฌ๋“œ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ(2๋ฒˆ)์—์„œ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ (0, 0) ์ผ ๋•Œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๋ฉด Xํ‘œ์‹œ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋ฏธ๋กœ ๋ฐ–์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์—†๋‹ค๊ณ  ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆฌ๋“œ ๋‚ด์—์„œ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๋„ฃ์–ด์คฌ๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๋‹ค๊ฐ€ ์ด๋™ํ•œ ์œ„์น˜๊ฐ€ ์ด๋™ํ•˜๊ธฐ ์ „ ์œ„์น˜์™€ ๊ธ€์ž์™€ ๊ฐ™๋‹ค๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ (0, 0)์ผ ๋•Œ graph[0][0]์ด๊ณ  ์ด ๊ฐ’์€ ํ˜„์žฌ 'R'์ด๋‹ค. ๊ฑฐ๊ธฐ์„œ ์šฐ์ธก(graph[0][1])์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ–ˆ๋”๋‹ˆ 'R'์ด ์žˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ™์€ ๊ตฌ์—ญ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋™๋œ ์ขŒํ‘œ๋ฅผ ๋‹ค์‹œ ํ์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋Ÿผ ์ด๋™๋œ ์ขŒํ‘œ๊ฐ€ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋œ๋‹ค. ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‹ค ํ™•์ธํ–ˆ์œผ๋ฉด ๋‹ค์‹œ ํ์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊บผ๋‚ด์„œ ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

3.2 DFS 

DFS๋ฅผ ์ •์˜ํ•˜๊ธฐ ์ „์— ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒŒ ์žˆ๋‹ค.

import sys
sys.setrecursionlimit(100000)

ํŒŒ์ด์ฌ์˜ ์žฌ๊ท€ ์ตœ๋Œ€ ๊นŠ์ด์˜ ๊ธฐ๋ณธ ์„ค์ •์ด 1,000ํšŒ์ด๊ธฐ ๋•Œ๋ฌธ์— 'sys.setrecursionlimit(100000)' ์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ DFS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

def DFS(x, y):
    visited[y][x] == 1

    #์ขŒ์šฐ์ƒํ•˜ ํ™•์ธ
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if 0 <= nx <= N and 0 <= ny <= N and visited[ny][nx] == 0 and graph[ny][nx] == graph[y][x]:
            DFS(nx, ny)

DFS๋„ ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ BFS๋ณด๋‹ค ํ’€์ด๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ํ˜„์žฌ ์ขŒํ‘œ์˜ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•ด์ค€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ DFS์™€ ๋‹ค๋ฅด๊ฒŒ x์™€ y์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ด์œ ๋Š” ๋„“์ด ํƒ์ƒ‰์ด ์•„๋‹ˆ๋ผ ๊นŠ์ด ํƒ์ƒ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

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

 

4. Main (์ž…๋ ฅ ๋ถ€๋ถ„)

N = int(input())
graph = []
for _ in range(N):
    graph.append(list(map(str, input().rstrip())))
#graph = [list(map(str, input().rstrip())) for _ in range(N)] ์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ฆฌ๋“œ์˜ ํฌ๊ธฐ์™€ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. 

 

5. ์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์™€ ์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ”

#์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ
visited = [[0]*N for _ in range(N)] #๋ฐฉ๋ฌธ ํ‘œ์‹œ
cnt1 = 0
for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            cnt1 += 1
            BFS(i, j) #DFS(j, i) 

#์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ
#visited = [[0 for _ in range(N)] for _ in range(N)] ์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅ
visited = [[0]*N for _ in range(N)] #์ดˆ๊ธฐํ™”
cnt2 = 0
for i in range(N):
    for j in range(N):
        if graph[i][j] == 'G': #G -> R๋กœ ๋ณ€ํ™˜
            graph[i][j] = 'R'

for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            cnt2 += 1
            BFS(i, j) #DFS(j, i) 
print(cnt1, cnt2)

๋จผ์ € ์ด์ค‘for๋ฌธ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒƒ(0)์„ ์นด์šดํŠธ ํ•ด์ฃผ๊ณ  BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด BFS๊ฐ€ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๊ณ  BFS๊ฐ€ ๋๋‚ฌ์œผ๋ฉด ๋‹ค์‹œ for๋ฌธ์œผ๋กœ ๋Œ์•„์™€์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์„ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๊ตฌ์—ญ์„ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ ๋ก์ƒ‰์•ฝ์ผ ๊ฒฝ์šฐ์— ๋ฐฉ๋ฌธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ํ•„์ž๋Š” ์ดˆ๋ก์ƒ‰์„ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๊นŒ์ฒ˜๋Ÿผ ๋ฐ˜๋ณตํ•ด์ค€๋‹ค. ์ฃผ์˜ํ•  ๊ฒƒ์€ DFSํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” i์™€ j์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

BFS ํ’€์ด (์ „์ฒด ์ฝ”๋“œ)

from collections import deque
import sys
input = sys.stdin.readline #์ž…์ถœ๋ ฅ ํ–ฅ์ƒ

N = int(input())
graph = []
for _ in range(N):
    graph.append(list(map(str, input().rstrip())))

def BFS(x, y):
    # ์ขŒ์šฐ์ƒํ•˜
    dx = [-1, 1, 0, 0]
    dy = [0, 0, 1, -1]

    q = deque() #ํ ์ƒ์„ฑ
    q.append((x, y)) #ํ์— ์ดˆ๊ธฐ ์œ„์น˜ ๋„ฃ๊ธฐ
    visited[x][y] = 1

    #์ขŒํ‘œ ์ด๋™ํ•˜๋ฉด์„œ ํ™•์ธ
    while q:
        x, y = q.popleft() #ํ์—์„œ ๊บผ๋‚ด์„œ x, y์— ๋„ฃ๊ธฐ

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

            if -1 < nx < N and -1 < ny < N: #์ด๊ฒŒ ๋ฌธ์ œ
                if graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
                    visited[nx][ny] = 1  # ๋ฐฉ๋ฌธ์ฒดํฌ ํ›„ ํ์— ๋„ฃ์Œ
                    q.append((nx, ny))

#์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ
visited = [[0 for _ in range(N)] for _ in range(N)] #๋ฐฉ๋ฌธ ํ‘œ์‹œ
cnt1 = 0
for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            BFS(i, j)
            cnt1 += 1

#์ ๋ก์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ
visited = [[0 for _ in range(N)] for _ in range(N)]
cnt2 = 0
for i in range(N):
    for j in range(N):
        if graph[i][j] == 'G': #G -> R๋กœ ๋ณ€ํ™˜
            graph[i][j] = 'R'

for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            BFS(i, j)
            cnt2 += 1
print(cnt1, cnt2)

 

DFS ํ’€์ด (์ „์ฒด ์ฝ”๋“œ)

import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline

def DFS(x, y):
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    visited[y][x] = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < N and 0 <= ny < N and graph[y][x] == graph[ny][nx] and visited[ny][nx]==0:
            DFS(nx, ny)

N = int(input())
graph = []
for _ in range(N):
    graph.append(list(map(str, input().rstrip())))
visited = [[0]*N for _ in range(N)] #๋ฐฉ๋ฌธ ํ‘œ์‹œ
cnt1 = 0
for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            cnt1 += 1
            DFS(j, i)

#์ ๋ก์ƒ‰์•ฝ
visited = [[0]*N for _ in range(N)]
cnt2 = 0
for i in range(N):
    for j in range(N):
        if graph[i][j] == 'G': #G -> R๋กœ ๋ณ€ํ™˜
            graph[i][j] = 'R'

for i in range(N):
    for j in range(N):
        if visited[i][j] == 0:
            cnt2 += 1
            DFS(j, i)
print(cnt1, cnt2)

 

 

728x90