<๋ฌธ์ ๋งํฌ>
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LwsHaD1MDFAXc
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
<ํ์ด ์ ๋ต>
1. ์ต์๋ก ํด๋ฆญ์ ๊ตฌํด์ผ ํ๋ฏ๋ก ์ฃผ๋ณ์ ์ง๋ขฐ๊ฐ ์๋(์นด์ดํธ 0) ์์น๋ฅผ ๋จผ์ ๋ค ๋๋ฅด๊ณ ๋จ์ ์์น๋ฅผ ๋๋ฌ์ฃผ๋ฉด ๋๋ค.
2. ํด๋น ์์น๊ฐ ์ฃผ๋ณ์ ์ง๋ขฐ๊ฐ ์๋ ๊ณณ์ธ์ง ํ์ธํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ์์ ํ์์ ํตํด์ ํด๋น ์์น๊ฐ ์ฃผ๋ณ์ ์ง๋ขฐ๊ฐ ์๋ ๊ณณ์ด๋ฉด bfs๋ก ์ฃผ๋ณ์ ๋ฐํ์ค๋ค.
3. ๋จ์ ๊ณณ๋ค(์ฃผ๋ณ์ ์ง๋ขฐ๊ฐ ์๋ ๊ณณ)์ ๋๋ ์ ๋ ์์ ๋ง ๋ฐํ์ง๋ ๊ณณ์ด๋ฏ๋ก ๊ทธ๋ฅ ์์ ํ์์ผ๋ก ๊ฐ์๋ฅผ ์ธ์ฃผ๋ฉด ๋๋ค.
4. visited ๋ฐฐ์ด์ ๋ฐ๋ก ์ ์ฐ๊ณ ์ฃผ์ด์ง ๋ฐฐ์ด์์ ํ๋ฒ์ ์ฒ๋ฆฌํ ์๋ ์๋๋ฐ java๋ก ๋ฌธ์ ๋ฅผ ๊ฑฐ์ ์ ํ์ด๋ด์ ๊ทธ๋ฅ visited๋ฐฐ์ด์ ๋ฐ๋ก ์ ์ธํ๋ค. (ํ์ด์ฌ์ด๋ผ๋ฉด ๋ฐฐ์ด ํ์ ์ ์นด์ดํธ๋ฅผ ํ๊ธฐํด์ฃผ๋ฉด์ visited ๋ฐฐ์ด์ ๋์ฒดํ ์ ์์ ๊ฒ ๊ฐ๋ค)
<์ ๋ต ์ฝ๋>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution {
// ์
์ถ๋ ฅ
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static StringTokenizer st;
private static final StringBuilder sb = new StringBuilder();
// ๋ณ์ ์ ์ธ
private static int T, N, ans;
private static char[][] arr;
private static boolean[][] visited;
private static final int[] dr = {-1, 1, 0, 0, -1, 1, 1, -1};
private static final int[] dc = {0, 0, -1, 1, 1, -1, 1, -1};
private static class Node{
int r;
int c;
public Node(int r, int c) {
this.r = r;
this.c = c;
}
}
// bfs๋ก ํด๋ฆญ
private static void bfs (int r, int c) {
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(r, c));
visited[r][c] = true;
while (!queue.isEmpty()) {
Node node = queue.remove();
// ์ฃผ๋ณ์ ์ง๋ขฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์งํ
if (!checkSafe(node.r, node.c)) {
continue;
}
for (int i = 0; i < 8; i++) {
int nr = node.r + dr[i];
int nc = node.c + dc[i];
if (0 <= nr && nr < N && 0 <= nc && nc < N) {
if (!visited[nr][nc]) {
visited[nr][nc] = true;
queue.add(new Node(nr, nc));
}
}
}
}
}
// ์ฃผ๋ณ์ ์ง๋ขฐ ์๋์ง ์๋์ง ํ์ธ
public static boolean checkSafe(int r, int c) {
for (int i = 0; i < 8; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (0 <= nr && nr < N && 0 <= nc && nc < N) {
if (arr[nr][nc] == '*') {
return false;
}
}
}
return true;
}
public static void main(String[] args) throws IOException {
T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
// ๋ณ์ ์ด๊ธฐํ
N = Integer.parseInt(br.readLine());
arr = new char [N][N];
visited = new boolean[N][N];
ans = 0;
// ์
๋ ฅ
for (int i = 0; i < N; i++) {
arr[i] = br.readLine().toCharArray();
}
// ์ง๋ขฐ ์ฌ๋ถ ํ์
ํ ์ฃผ๋ณ์ ์ง๋ขฐ ์๋ ๊ณณ๋ง ๋จผ์ ํด๋ฆญ
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ์ง๋ขฐ ์์ ๊ฒฝ์ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
if (arr[i][j] == '*') {
visited[i][j] = true;
}
// ์ง๋ขฐ ์๊ณ ๋ฏธ๋ฐฉ๋ฌธ์ผ ๊ฒฝ์ฐ
else if (!visited[i][j] && arr[i][j] == '.') {
// ์ฃผ๋ณ์ ์ง๋ขฐ ์์ ๊ฒฝ์ฐ
if (checkSafe(i, j)) {
// ํด๋ฆญ
bfs(i, j);
ans ++;
}
}
}
}
// ๋จ์ ๊ณณ๋ค ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ ์ธ์ฃผ๊ธฐ
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j]) {
ans ++;
}
}
}
sb.append("#" + t + " " + ans + "\n");
}
System.out.println(sb);
}
}
'โญ Problem_Solving > SWEA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 1767. ํ๋ก์ธ์ ์ฐ๊ฒฐํ๊ธฐ (Java / ์๋ฐ) (0) | 2023.02.13 |
---|
๋๊ธ