[Baekjoon] 1303번 전쟁 - 전투
Updated:
문제
전쟁은 어느덧 전면전이 시작되었다. 결국 전투는 난전이 되었고, 우리 병사와 적국 병사가 섞여 싸우게 되었다.
그러나 당신의 병사들은 하얀 옷을 입고, 적국의 병사들은 파란옷을 입었기 때문에 서로가 적인지 아군인지는 구분할 수 있다.
문제는, 같은 팀의 병사들은 모이면 모일수록 강해진다는 사실이다.
N명이 뭉쳐있을 때는 N^2의 위력을 낼 수 있다. 과연 지금 난전의 상황에서는 누가 승리할 것인가? 단, 같은 팀의 병사들이 대각선으로만 인접한 경우는 뭉쳐 있다고 보지 않는다.
입력
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는 병사가 한 명 있다. (B는 파랑, W는 흰색이다.)
출력
첫 번째 줄에 당신의 병사의 위력의 합과 적국의 병사의 위력의 합을 출력한다.
예제
Example 1:
Input:
5 5
WBWWW
WWWWW
BBBBB
BBBWW
WWWWW
Output:
130 65
조건
시간 제한 : 2초
메모리 제한 : 128 MB
풀이과정
내 풀이
m, n= map(int, input().split())
graph = []
for i in range(n):
graph.append(list(input()))
# 결과값을 담을 변수 선언
w_ans, b_ans = 0, 0
w_cnt, b_cnt = 0, 0
# dfs 정의
def wdfs(x,y):
global w_cnt, w_ans
if x <= -1 or x >= n or y <= -1 or y >= m:
return False
if graph[x][y] == 'W':
w_cnt += 1
graph[x][y] = 1
wdfs(x - 1, y)
wdfs(x, y - 1)
wdfs(x + 1, y)
wdfs(x, y + 1)
return True
return False
def bdfs(x,y):
global b_cnt, b_ans
if x <= -1 or x >= n or y <= -1 or y >= m:
return False
if graph[x][y] == 'B':
b_cnt += 1
graph[x][y] = 1
bdfs(x - 1, y)
bdfs(x, y - 1)
bdfs(x + 1, y)
bdfs(x, y + 1)
return True
return False
# 결과 계산 및 출력
for i in range(n):
for j in range(m):
if wdfs(i, j) == True:
w_ans += w_cnt ** 2
w_cnt = 0
for i in range(n):
for j in range(m):
if bdfs(i, j) == True:
b_ans += b_cnt ** 2
b_cnt = 0
print(w_ans, b_ans)
가로, 세로를 헷갈려서 인덱스 에러가 났다. 따라서 n과 m을 바꾸어주었음.
Leave a comment