내가 생각했을때 문제에서 원하는부분
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다.
그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다.
모든 자리에는 병사가 한 명 있다. B는 파란색, W는 흰색이다.
당신의 병사와 적국의 병사는 한 명 이상 존재한다.
첫 번째 줄에 당신의 병사의 위력의 합과 적국의 병사의 위력의 합을 출력한다.
내가 이 문제를 보고 생각해본 부분
N과 M은 전투장의 가로와 세로 크기를 나타낸다.
battlefield 배열은 각 위치에 있는 병사의 색상을 저장합니다. 'W'는 흰색(아군), 'B'는 파란색(적군)이다.
visited 배열은 이미 탐색한 병사 위치를 기록하여 중복 탐색을 방지한다.
dx와 dy 배열은 상하좌우로 이동하기 위한 방향을 정의한다.
표준 입력을 통해 전투장의 크기(N, M)를 읽고, battlefield 배열에 각 병사의 색상을 저장한다.
병사들의 상태를 입력받기 위해 for 루프를 사용한다.
아군과 적군의 위력 계산:
totalPowerW와 totalPowerB는 각각 아군과 적군의 총 위력을 저장한다.
이중 for 루프를 통해 battlefield의 모든 위치를 탐색합니다. 방문하지 않은 병사에 대해 BFS 탐색을 실행한다.
bfs 메서드를 호출하여 병사의 그룹 크기를 구하고, 해당 그룹의 위력을 계산하여 각 팀의 총 위력에 더한다.
BFS 탐색 메서드:
BFS를 사용하여 같은 팀의 병사들을 탐색한다.
시작 위치를 큐에 추가하고, 방문 표시를 한다.
큐에서 병사의 위치를 꺼내고, 상하좌우로 이동하여 같은 팀의 병사들을 찾아 큐에 추가한다.
그룹의 크기를 계산하여 반환한다.
전체 흐름:
전투장의 크기와 병사 배치를 입력받는다.
모든 병사에 대해 BFS를 수행하여 그룹을 찾고, 각 그룹의 위력을 계산한다.
아군과 적군의 총 위력을 출력한다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
// 백준 1303번 문제
public class Main870 {
static int N, M; // 전투장의 가로(N)와 세로(M) 크기
static char[][] battlefield; // 전투장의 병사들 상태를 저장할 2차원 배열
static boolean[][] visited; // 병사 방문 여부를 저장할 2차원 배열
static int[] dx = {-1, 1, 0, 0}; // 상하 이동을 위한 배열
static int[] dy = {0, 0, -1, 1}; // 좌우 이동을 위한 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] dimensions = br.readLine().split(" ");
N = Integer.parseInt(dimensions[0]);
M = Integer.parseInt(dimensions[1]);
battlefield = new char[M][N];
visited = new boolean[M][N];
for(int i = 0; i < M; i++) {
battlefield[i] = br.readLine().toCharArray();
}
int totalPowerW = 0;
int totalPowerB = 0;
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
if(!visited[i][j]) {
char soldierType = battlefield[i][j];
int groupSize = bfs(i, j, soldierType);
int power = groupSize * groupSize;
if(soldierType == 'W') {
totalPowerW += power;
} else {
totalPowerB += power;
}
}
}
}
System.out.println(totalPowerW + " " + totalPowerB);
br.close();
}
static int bfs(int startX, int startY, char soldierType) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{startX, startY});
visited[startX][startY] = true;
int size = 0;
while(!queue.isEmpty()) {
int[] current = queue.poll();
size++;
for(int d = 0; d < 4; d++) {
int newX = current[0] + dx[d];
int newY = current[1] + dy[d];
if(newX >= 0 && newX < M && newY >= 0 && newY < N &&
!visited[newX][newY] && battlefield[newX][newY] == soldierType) {
visited[newX][newY] = true;
queue.offer(new int[]{newX, newY});
}
}
}
return size;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.