알고리즘 문제풀이/백준

#1303 : 전쟁 - 전투

모항 2022. 5. 30. 14:23

풀이방법

사용된 것:

깊이우선탐색(DFS)

 

2022.05.30

첫 칸부터 마지막 칸까지 훑으면서,

아직 방문하지 않은 칸에 대하여 그 칸을 시작점으로 그 칸과 같은 편인 칸에 대하여 dfs를 돈다. 그러면서 몇 칸을 방문했는지 센다.

해당 dfs가 끝나면 몇 칸 방문했는지 센 수를 제곱하여 정답에 더한다.

 

코드

Java(2022.05.30)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	static boolean[][] map;	//전쟁터 지도
	static boolean[][] visited;	//방문여부 저장용 배열
	static int cnt;	//해당 구역의 동일한 편 병사의 수
	static int n, m;	//전쟁터의 가로 크기, 세로 크기
	//아래는 상하좌우 재귀 시에 사용할 좌표변경용 배열
	static int[] r = {-1, 1, 0, 0};
	static int[] c = {0, 0, -1, 1};
	
	static void dfs(int row, int col, boolean color) {
		//전쟁터 바깥이거나, 이미 방문했거나, 상대편이면 return
		if(row<0 || col<0 || row>=m || col>=n)return;
		if(visited[row][col])return;
		if(map[row][col] != color)return;
		
		visited[row][col] = true;	//방문했다고 표시
		cnt++;	//인접한 같은 편 수 세기
		for(int i=0; i<4; i++)dfs(row+r[i], col+c[i], color);	//상하좌우에 대하여 재귀
	}

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new boolean[m][n];
		visited = new boolean[m][n];
		//전쟁터 읽어오기
		for(int i = 0; i<m; i++) {
			String input = br.readLine();
			for(int j = 0; j<n; j++) {
				if(input.charAt(j)=='B') map[i][j]=true;
			}
		}
		//깊이우선탐색 하기
		int white = 0;
		int blue = 0;
		for(int i = 0; i<m; i++) {
			for(int j = 0; j<n; j++) {
				if(!visited[i][j]) {	//아직 방문하지 않은 칸에 대하여
					cnt = 0;	//인접한 같은 편 수를 셀 변수를 0으로 초기화
					dfs(i, j, map[i][j]);	//깊이우선탐색 수행
					if(map[i][j]) blue += Math.pow(cnt, 2);	//센 값을 제곱해서 알맞은 팀에 더해줌
					else white += Math.pow(cnt, 2);
				}
			}
		}
		//정답 출력
		System.out.print(white + " " + blue);
	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#14626 : ISBN  (0) 2022.06.01
#1260 : DFS와 BFS  (0) 2022.06.01
#2667 : 단지번호붙이기  (0) 2022.05.29
#11659 : 구간 합 구하기 4  (0) 2022.05.29
#1780 : 종이의 개수  (0) 2022.05.28