백준 1303번 전쟁 - 전투

전쟁 - 전투 문제 바로 가기

baekjoon 알고리즘 문제 풀이
문제:
전쟁이 일어난 땅에는 두 나라가 존재한다. 각각 W, B로 표현되며, 같은 병사끼리 인접한(상하좌우) 곳에 모이면 하나의 군대를 형성한다. 각 나라의 전투력은 군대에 속한 병사의 수의 제곱으로 정의된다. 지도를 보고 양 나라의 전투력을 계산하시오.
입력
첫 줄에 가로 크기 W와 세로 크기 H가 주어진다. 그 다음 H줄에 W개의 문자가 입력된다. 문자는 W 또는 B 중 하나이다.
출력
첫째 줄에 우리 병사의 전투력과 적국 병사의 전투력을 출력한다.

풀이 코드


from collections import deque

dx = [0,0,-1,1]
dy = [-1,1,0,0]

w,h = map(int, input().split())
graph = [list(map(str,input().strip())) for _ in range(h)]
visited = [[False]*w for _ in range(h)]
ours = []
yours = []

def bfs1(x,y):
    q = deque()
    q.append((x,y))
    visited[y][x] = True
    our = 1

    while q:
        x,y = q.popleft()
        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y

            if 0<=nx<w and 0<=ny<h and not visited[ny][nx] and graph[ny][nx] == 'W':
                our+=1
                visited[ny][nx] = True
                q.append((nx,ny))

    return our

def bfs2(x,y):
    q = deque()
    q.append((x,y))
    visited[y][x] = True
    you = 1

    while q:
        x,y = q.popleft()
        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y

            if 0<=nx<w and 0<=ny<h and not visited[ny][nx] and graph[ny][nx] == 'B':
                you+=1
                visited[ny][nx] = True
                q.append((nx,ny))

    return you

for y in range(h):
    for x in range(w):
        if graph[y][x] == 'W' and not visited[y][x]:
            ours.append(bfs1(x,y))
        if graph[y][x] == 'B' and not visited[y][x]:
            yours.append(bfs2(x,y))

print(sum(i*i for i in ours), sum(i*i for i in yours))
  

해결 전략:

  • W 병사와 B 병사를 각각 BFS로 탐색하여 독립된 군대 단위로 전투력 계산
  • 같은 문자를 가진 병사끼리만 연결되도록 조건 설정
  • 각 군대 병사의 수를 제곱하여 리스트에 누적
  • 마지막에 전투력을 각각 합산하여 출력