개발/algorithm

[백준 1303번] 전쟁 - 전투 -python

zzi_on2 2022. 1. 26. 18:19

문제 링크

https://www.acmicpc.net/problem/1303

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

 

풀이 

- bfs 문제

- 계속 런타임 에러 떠서 이유를 찾느라 한참 걸렸는데 가로 크기가 N 이고 세로 크기가 M 인 이유 때문이었다. 

- 병사 색깔을 함께 넘겨주어 뭉쳐있는 병사들의 수를 구해 리턴한다. 

- 개수를 센 병사의 위치는 "#"로 표시하여 준다. 

- 병사 수의 제곱을 더해준다. 

from collections import deque 

nx = [ 1, -1, 0, 0 ]
ny = [ 0, 0, 1, -1 ]

def bfs(color,i,j):
  # 병사 수 
  count = 1 
  
  q= deque()
  q.append((i,j))
  # 방문 표시 
  maps[i][j] = "#"
  
  while q :
    x, y = q.popleft()

    for i in range(4):
      dx = x + nx[i]
      dy = y + ny[i]
    
      if 0 <= dx < m and 0 <= dy < n and maps[dx][dy] == color:
        count += 1
        maps[dx][dy] = "#"
        q.append((dx,dy))

  return count

n, m = map(int,input().split())

maps = []

for _ in range(m):
  maps.append(list(map(str,input())))

b_num = 0
w_num = 0 

for i in range(m):
  for j in range(n):
  
    if maps[i][j] == 'B':
      tmp = bfs('B',i,j)
      b_num += tmp * tmp 
      
    elif maps[i][j] == 'W':
      tmp = bfs('W',i,j)
      w_num += tmp * tmp 

print(w_num,b_num)