[BOJ] 10026๋ฒˆ | ์ ๋ก์ƒ‰์•ฝ (Python3)

2022. 5. 14. 17:49ใ†Coding Test/BOJ

๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

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

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

www.acmicpc.net

 

 

๋ฌธ์ œ ์„ค๋ช…

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๋ฆผ์ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

 

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

 


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100)
๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ ์ค„์—๋Š” ๊ทธ๋ฆผ์ด ์ฃผ์–ด์ง„๋‹ค.

 


์ถœ๋ ฅ

์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ์˜ ๊ตฌ์—ญ์˜ ๊ฐœ์ˆ˜์™€ ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ์˜ ๊ตฌ์—ญ์˜ ์ˆ˜๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ ์ž…์ถœ๋ ฅ

 


ํ’€์ด ์ „๋žต

DFS/BFS์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ซ๊ณ , ์šฐ์„  DFS ๋ฌธ์ œ๋ถ€ํ„ฐ ํ’€์–ด ๋ด์•ผ์ง€ ํ•˜๊ณ  ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€์— ๋“ค์–ด๊ฐ€ ๋ดค๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ๋‹ค์Œ ๋ฌธ์ œ์˜€๋‹ค. ๋‚˜์ค‘์— ํ™•์ธํ•œ ์‚ฌ์‹ค์ธ๋ฐ, ๋‚œ์ด๋„ ๊ณจ๋“œ 5์งœ๋ฆฌ ๋ฌธ์ œ์˜€๋‹ค. ์ฒ˜์Œ ๋„์ „ํ•˜๋Š” ๋‚˜์—๊ฒŒ๋Š” ๋ฒ…์ฐฌ ์ˆ˜์ค€์ด ์•„๋‹ˆ์—ˆ์„๊นŒ?.... ํ’€์—ˆ๋˜ ์ „๋žต์„ ์†Œ๊ฐœํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

 


์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

import sys
sys.setrecursionlimit(10**6) # ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ•œ๊ณ„์น˜๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜

n = int(input())
graph = []

# ์ƒ‰๊น” ์ •๋ณด ๋ฐ›๊ธฐ
for _ in range(n):
  graph.append(list(input()))


def DFS(graph, color, x, y, hasBlind):
  if x < 0 or x >= n or y < 0 or y >= n:  # ์œ ํšจํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ข…๋ฃŒ
      return False
  
  if hasBlind:   # ์ ๋ก์ƒ‰์•ฝ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ผ ๊ฒฝ์šฐ
      if (graph[x][y] == 'R' or graph[x][y] == 'G') and (color == 'R' or color == 'G'):
          color = graph[x][y] 
  
  if graph[x][y] == color:     # ๊ฐ™์€ ์ƒ‰๊น”์ผ ๊ฒฝ์šฐ
      graph[x][y] = '#'        # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
      DFS(graph, color, x - 1, y, hasBlind)  # ์ƒ
      DFS(graph, color, x + 1, y, hasBlind)  # ํ•˜
      DFS(graph, color, x, y - 1, hasBlind)  # ์ขŒ
      DFS(graph, color, x, y + 1, hasBlind)  # ์šฐ
      # ์ฃผ๋ณ€์„ ๋‹ค์‹œ ํƒ์ƒ‰
     
      return True  # ๋ชจ๋“  DFS๋ฅผ ๋งˆ์ณค์„ ๊ฒฝ์šฐ
  return False     # ์ฃผ๋ณ€์— ๊ฐ™์€ ์ƒ‰๊น”์ธ ๊ฒŒ ์—†์„ ๊ฒฝ์šฐ


generalResult = 0
blindnessResult = 0
generalGraph = [_list.copy() for _list in graph]
blindGraph = [_list.copy() for _list in graph]


for i in range(n):
  for j in range(n):
    if generalGraph[i][j] != '#':
        if DFS(generalGraph, generalGraph[i][j], i, j, False): # ์ผ๋ฐ˜ ์‚ฌ๋žŒ์ผ ๊ฒฝ์šฐ
          generalResult += 1
    
    if blindGraph[i][j] != '#':
        if DFS(blindGraph, blindGraph[i][j], i, j, True):      # ์ ๋ก์ƒ‰์•ฝ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ผ ๊ฒฝ์šฐ
            blindnessResult += 1
    
print(generalResult, blindnessResult, end = ' ')

 

<์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค. with ํŒŒ์ด์ฌ> ์ฑ…์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ–ˆ๋˜ DFS ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ง๋ถ™์˜€๋‹ค.

Visual Studio Code์˜ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€๋ฅผ ๋ณด๋ฉด์„œ ํ™•์ธํ•ด๋ดค๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  DFS ๊ตฌํ˜„์„ ์œ„ํ•ด, ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ž๊พธ ๋–ด์—ˆ๋‹ค.

์•Œ๊ณ ๋ณด๋‹ˆ, ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์žฌ๊ท€ ๊นŠ์ด ์ œํ•œ์ด 1000์ •๋„๋ผ ์–•์•„์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค.

๊ทธ๋ž˜์„œ ํŒŒ์ด์ฌ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณผ ๊ฑฐ๋ฉด, ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ•œ๊ณ„์น˜๋ฅผ ๋Š˜๋ ค์ฃผ๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. 

import sys
sys.setrecursionlimit(10 ** 6)  # 1000000๋ฒˆ์œผ๋กœ ํ˜ธ์ถœ ํ•œ๊ณ„์น˜ ์„ค์ •

 

728x90
๋ฐ˜์‘ํ˜•