PS/BOJ

백준 1303 전쟁-전투 / JAVA

얍연구소장 2023. 5. 25.

https://www.acmicpc.net/problem/1303

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

 

> 풀이(BFS)

/*
 * 백준 1303 전쟁-전투
 * #실버1
 * #BFS
 * 23.05.25
 */
public class boj_1303 {
    static int N,M;
    static int[] dx = {1,0,-1,0};
    static int[] dy = {0,1,0,-1};
    static char[][] map;
    static boolean[][] visited;
    static class Point {
        int x,y;
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
	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 char[M][N];
        visited = new boolean[M][N];
        
        for(int i = 0; i < M; i++) {
            map[i] = br.readLine().toCharArray();
        }
        
        int wPower = 0; int bPower = 0;
        for(int i = 0; i < M; i++) {
            for(int j = 0; j < N; j++) {
                if(!visited[i][j]) {
                    int cnt = BFS(i,j,map[i][j]);
                    if(map[i][j] == 'W') {
                        wPower += cnt;
                    } else {
                        bPower += cnt;
                    }
                }
            }
        }
        
        System.out.println(wPower);
        System.out.println(bPower);

	}
	
    public static int BFS(int x, int y, char z) {
        Queue<Point> q = new LinkedList<>();
        visited[x][y] = true;
        q.offer(new Point(x,y));
        
        int rtnCnt = 1;
        while(!q.isEmpty()) {
            Point point = q.poll();
            for(int i = 0; i < 4; i++) {
                int nx = point.x + dx[i];
                int ny = point.y + dy[i];
                if(nx >= 0 && nx < N && ny >= 0 && ny < M) {
                	if(!visited[nx][ny] && map[nx][ny] == z) {
                		visited[nx][ny] = true;
                		rtnCnt++;
                		q.offer(new Point(nx,ny));
                	}
                }
            }
        }
        return rtnCnt * rtnCnt;
    }
}

'PS > BOJ' 카테고리의 다른 글

백준 1926 그림 / JAVA  (0) 2023.05.24
백준 11725 트리의 부모 찾기 / JAVA  (0) 2023.05.23
백준 1388 바닥장식 / JAVA  (0) 2023.05.18
백준 4963 섬의개수 / JAVA  (0) 2023.05.17
백준 6603 로또 / JAVA  (0) 2023.05.16

댓글