๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/SWEA

[SWEA] 1868. ํŒŒํ•‘ํŒŒํ•‘ ์ง€๋ขฐ์ฐพ๊ธฐ (Java / ์ž๋ฐ”)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 15.

<๋ฌธ์ œ ๋งํฌ>

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

๋Œ“๊ธ€