본문 바로가기
알고리즘 문제풀이/백준

[백준 16988] Baaaaaaaaaduk2(Easy) (JAVA)

by 소보루:-) 2020. 4. 27.

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

 

16988번: Baaaaaaaaaduk2 (Easy)

서기 2116년, 인간은 더 이상 AI의 상대가 되지 못하게 되었다. 근력, 순발력, 창의력, 사고력, 문제해결능력, 심지어 인간미조차 AI가 인간을 앞선다. AI가 온 지구를 관리하며 이미 인류는 지구의 주인 자리에서 쫓겨난지 오래이다. 그나마 다행인 것은 AI가 인간을 적대적으로 대하지 않고, 도리어 AI가 쌓아올린 눈부신 기술의 발전으로 모든 사람이 무제한적인 재화를 사용할 수 있게 되어 한 세기 전의 사람들이 바라던 돈 많은 백수와 같은 삶을 누릴

www.acmicpc.net

 

 

작년에 시간초과나고 포기한 문제였다..

다시 풀었는데 한번에 맞아서 뿌듯..!

bfs로 검은돌끼리 퍼져나가게 했다. 흰돌로 둘러싸인 흑돌갯수를 카운트해주었다.

도중에 빈공간 인 곳과 만나면 empty변수값을 증가시켜주어,

bfs가 끝났을 때 empty가 0일 때만 total값에 더해주었다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

class Baduk {
	int x;
	int y;

	public Baduk(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}

}

public class Main_bj_16988_바둑2 {

	static int N, M, ans = 0;// 행,열
	static int[][] map;// 0은 빈칸,1은 나의돌,2는 상대돌
	static boolean[][] visit;
	static int[] dx = { 0, 0, 1, -1 };
	static int[] dy = { 1, -1, 0, 0 };
	static List<Baduk> list;

	public static void main(String[] args) throws Exception {
		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 int[N][M];
		visit = new boolean[N][M];
		list = new ArrayList<Baduk>();

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if (map[i][j] == 0) {
					list.add(new Baduk(i, j));
				}
			}
		} // 입력끝
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = i + 1; j < list.size(); j++) {
				Baduk a = list.get(i);
				Baduk b = list.get(j);
				map[a.x][a.y] = 1;
				map[b.x][b.y] = 1;
				solve();
				map[a.x][a.y] = 0;
				map[b.x][b.y] = 0;
				visit = new boolean[N][M];
			}
		}
		System.out.println(ans);

	}

	private static void solve() {
		Queue<Baduk> q;
		int total=0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (map[i][j] == 2 &&visit[i][j]==false) {
					q = new LinkedList<Baduk>();
					visit[i][j] = true;
					q.offer(new Baduk(i, j));
					int nowCnt = 1;
					int empty = 0;
					while (!q.isEmpty()) {
						Baduk b = q.poll();
						for (int d = 0; d < 4; d++) {
							int nx = b.x + dx[d];
							int ny = b.y + dy[d];
							if (nx < 0 || ny < 0 || nx >= N || ny >= M || visit[nx][ny] == true || map[nx][ny] == 1)
								continue;
							if (map[nx][ny] == 0) {
								empty++;
							}
							if (map[nx][ny] == 2) {
								visit[nx][ny] = true;
								q.offer(new Baduk(nx, ny));
								nowCnt++;
							}
						}
					}
					if (empty > 0)
						continue;
					total+=nowCnt;

				}
			}
		}
		if(total>ans)ans=total;

	}

}

댓글