[BOJ] 1303_전쟁&전투_Python

KSH7841·2021년 9월 14일

PYTHON/백준

목록 보기
3/7

배너를 클릭시 문제로 넘어갑니다

문제 : 전쟁&전투

전쟁은 어느덧 전면전이 시작되었다. 결국 전투는 난전이 되었고, 우리 병사와 적국 병사가 섞여 싸우게 되었다.
그러나 당신의 병사들은 하얀 옷을 입고, 적국의 병사들은 파란옷을 입었기 때문에 서로가 적인지 아군인지는 구분할 수 있다.
문제는, 같은 팀의 병사들은 모이면 모일수록 강해진다는 사실이다.

N명이 뭉쳐있을 때는 N^2의 위력을 낼 수 있다. 과연 지금 난전의 상황에서는 누가 승리할 것인가? 단, 같은 팀의 병사들이 대각선으로만 인접한 경우는 뭉쳐 있다고 보지 않는다.

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

R, C = map(int, input().split())
board = [[0]*(R+1)]


for i in range(C):
   column = [0] + list(input())
   board.append(column)


dc = [0, 0, -1, 1]
dr = [-1, 1, 0, 0]

White = 0
Blue = 0

visited = [[0] * (R+1) for _ in range(C+1)]

def dfs(c, r, x):
   global cnt
   cnt += 1
   visited[c][r] = 1
   for i in range(4):
       new_c = c + dc[i]
       new_r = r + dr[i]

       if 1 <= new_c <= C and 1 <= new_r <= R:
           if board[new_c][new_r] == x and not visited[new_c][new_r]:
               dfs(new_c, new_r, x)

for i in range(1, C+1):
   for j in range(1, R+1):
       if board[i][j] == 'W' and not visited[i][j]:
           cnt = 0
           dfs(i, j, 'W')
           White += cnt ** 2
           
cnt = 0            
for i in range(1, C+1):
   for j in range(1, R+1):
       if board[i][j] == 'B' and not visited[i][j]:
           cnt = 0
           dfs(i, j, 'B')
           Blue += cnt ** 2

print(White, Blue)

0개의 댓글