BOJ - 1303

주의·2024년 1월 1일
0

boj

목록 보기
34/214
post-thumbnail

**백준 문제 링크
전쟁 - 전투

❓접근법

  1. BFS를 사용했다.
  2. bfs 함수의 인자를 x,y,color로 설정한다.
    cnt(병사의 수)를 1 증가시키고,
    lst[nx][ny]의 인덱스가 범위 내에 있고,
    이전의 색깔(color)과 같으면 방문 처리하고, queue에 넣는다.
  3. 2개의 for문으로 lst를 돌면서
    lst[nx][ny]가 'W'이면 white에 (bfs(i,j,'W') 2)를 더하고
    lst[nx][ny]가 'B'이면 blue에 (bfs(i,j,'B') 2)를 더한다.
  4. 마지막으로 white와 blue를 반환하면 끝

👌🏻코드

from collections import deque

M,N = map(int, input().split())

lst = []

for i in range(N):
    lst.append(list(input()))
    
dx = [0,0,1,-1]
dy = [1,-1,0,0]

white, blue = 0,0

def bfs(x,y, color):
    queue = deque()
    queue.append((x,y))
    
    lst[x][y] = 0
    
    cnt = 0 # 병사
    
    while queue:
        x,y = queue.popleft()
        
        cnt += 1
        
        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]
            
            if (0<=nx<N) and (0<=ny<M) and (lst[nx][ny] == color):
                lst[nx][ny] = 0
                
                queue.append((nx,ny))
                
    return cnt
                
    
white, blue = 0,0

for i in range(N):
    for j in range(M):
        if lst[i][j] == 'W':
            white += (bfs(i,j,'W') ** 2)
        elif lst[i][j] == 'B':
            blue += (bfs(i,j,'B') ** 2)
            
print(white,blue)
        

주의할 점은 가로 크기가 N, 세로 크기가 M 이므로 인덱스에 주의해야 한다.

0개의 댓글