[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