[백준_Python] 1303번 - 전쟁_전투 [실버 1]

황준성·2024년 12월 3일
0

BOJ_Python

목록 보기
30/70

문제

입력 예시 1

5 5
WBWWW
WWWWW
BBBBB
BBBWW
WWWWW

출력 예시 1

130 65

문제 이해

상하좌우로 인접해 있는 연결요소의 수를 카운트 하고, 각 값을 제곱해서 더해주면 된다. 기본적인 DFS로직을 이해한다면 어렵지 않다.

두가지의 type이 있기 때문에 매개변수로 타입의 종류를 추가한다.

코드

# 백준 1303번 전쟁-전투

# 재귀 횟수, 읽는 속도 늘리기
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

# 방향벡터 동-서-남-북순
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def DFS(y, x, type):
    global war_map, white_cnt, blue_cnt, white_list, blue_list
    war_map[y][x] = 0
    
    if type == "W":
        white_cnt += 1
    elif type == "B":
        blue_cnt += 1

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < N and 0 <= ny < M and war_map[ny][nx] == type:
            DFS(ny, nx, type)

# 0. 입력 및 초기화
N, M = map(int, input().split()) # N가로, M세로
war_map = []

white_list = []
blue_list = []

# 1. 연결 정보 입력
for i in range(M):
    war_map.append(list(input().rstrip()))

# 2. DFS호출
for i in range(M):
    for j in range(N):
        if war_map[i][j] == "W":
            white_cnt = 0
            DFS(i, j, "W")
            white_list.append(white_cnt)
        elif war_map[i][j] == "B":
            blue_cnt = 0
            DFS(i, j, "B")
            blue_list.append(blue_cnt)

# 3. 각 값을 제곱
for i in range(len(white_list)):
    white_list[i] = (white_list[i]**2)

for i in range(len(blue_list)):
    blue_list[i] = (blue_list[i]**2)

# 4. 출력

print(sum(white_list), sum(blue_list), sep=" ")
profile
Make progress

0개의 댓글