백준

1303번: 전쟁 - 전투

bingual 2022. 3. 11. 21:24
반응형

 

 

 

풀이

 

dfs 와 bfs로 풀 수 있는 문제입니다.

 

 

dfs

...

아직 방문하지 않은 visited[i][j]가 == 'W' or 'B'인곳에서 dfs을 호출하고 visited[x][y] = 'V' 로 방문처리 해줍니다.

 

visited[i][j]가 'W', 'B'중 하나에 해당한다면 해당값으로 change의 값을 바꿔줍니다.

 

상,하,좌,우 에 대한 다음위치를 특정해주고 visited[nx][ny] == change 라면 dfs를 재호출 하고 cnt의 값을 1 증가시킵니다.

 

주위에 같은색 병사가 없다면 병사들이 뭉쳐있는 구역을 다 탐색한것이므로 cnt^2 을한 결과를 result에 할당합니다. 

...

 

 

 

bfs

...

아직 방문하지 않은 visited[i][j]가 == 'W' or 'B'인곳에서 bfs을 호출하고 visited[x][y] = 'V' 로 방문처리 해줍니다.

 

visited[i][j]가 'W', 'B'중 하나에 해당한다면 해당값으로 change의 값을 바꿔줍니다.

 

상,하,좌,우 에 대한 다음위치를 특정해주고 visited[nx][ny] == change 라면 방문처리를하고 queue에 nx,ny를 삽입한뒤 cnt의 값을 1 증가시킵니다.

 

주위에 같은색 병사가 없다면 병사들이 뭉쳐있는 구역을 다 탐색한것이므로 cnt^2 을한 결과를 result에 할당합니다. 

...

 

 

파이썬 dfs

import sys
sys.setrecursionlimit(1000000)

def dfs(x, y):
    global cnt
    dx = [-1,1,0,0]
    dy = [0,0,-1,1]
    visited[x][y] = 'V'

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

        if 0 <= nx < m and  0 <= ny < n and visited[nx][ny] == change:
            dfs(nx, ny)
            cnt += 1

n, m = map(int, input().split())
graph = [list(map(str, sys.stdin.readline().rstrip())) for _ in range(m)]
visited = [item[:] for item in graph]

cnt = 1
result1 = 0
result2 = 0
change = ""

for i in range(m):
    for j in range(n):
        if visited[i][j] == 'W':
            change = 'W'
            dfs(i, j)
            result1 += cnt * cnt    
            cnt = 1

visited = [item[:] for item in graph]
for i in range(m):
    for j in range(n):
        if visited[i][j] == 'B':
            change = 'B'
            dfs(i, j)
            result2 += cnt * cnt    
            cnt = 1

print(result1, result2)

 

 

 

파이썬 bfs

from collections import deque
import sys

def bfs(x, y):
    global cnt
    dx = [-1,1,0,0]
    dy = [0,0,-1,1]
    visited[x][y] = 'V'

    queue = deque()
    queue.append((x, y))
    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 and visited[nx][ny] == change:               
                visited[nx][ny] = 'V'
                queue.append((nx, ny))
                cnt += 1

n, m = map(int, input().split())
graph = [list(map(str, sys.stdin.readline().rstrip())) for _ in range(m)]
visited = [item[:] for item in graph]

cnt = 1
result1 = 0
result2 = 0
change = ""

for i in range(m):
    for j in range(n):
        if visited[i][j] == 'W':
            change = 'W'
            bfs(i, j)
            result1 += cnt * cnt    
            cnt = 1

visited = [item[:] for item in graph]
for i in range(m):
    for j in range(n):
        if visited[i][j] == 'B':
            change = 'B'
            bfs(i, j)
            result2 += cnt * cnt    
            cnt = 1

print(result1, result2)