๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm/Java][ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์นด์นด์˜คํ”„๋ Œ์ฆˆ ์ปฌ๋Ÿฌ๋ง๋ถ

๋ฐ˜์‘ํ˜•

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์นด์นด์˜คํ”„๋ Œ์ฆˆ ์ปฌ๋Ÿฌ๋ง๋ถ

https://programmers.co.kr/learn/courses/30/lessons/1829

๋ฌธ์ œ์ ‘๊ทผ

BFS๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ™์€ ์ƒ‰์ƒ์„ ๊ฐ€์ง„ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๊ณ  ์˜์—ญ๊ณผ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜์˜€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ขŒํ‘œ๊ฐ’๊ณผ ํ•ด๋‹น ์ขŒํ‘œ์˜ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ XYํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ Queue๋ฅผ ์ด์šฉํ•  ๋•Œ ํŽธํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

Code

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    class XY {
        int x;
        int y;
        int value; // ํ•ด๋‹น ์ขŒํ‘œ์˜ ๊ทธ๋ฆผ
        XY(){};
        XY(int x, int y, int value){
            this.x = x;
            this.y = y;
            this.value = value;
        }
    }
    boolean isIn(int x, int y, int m, int n){
        // ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜
        return (x <0 || x>=m || y < 0 || y >=n);
    }
    public int[] solution(int m, int n, int[][] picture) {
        int numberOfArea = 0;
        int maxSizeOfOneArea = 0;
        int[][] visited = new int[m][n]; //๋ฐฉ๋ฌธํ•œ ์œ„์น˜์ธ์ง€ ๊ธฐ๋ก(1์ด๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜)
        int[] dx = {-1,1,0,0};
        int[] dy = {0,0,-1,1};
        Queue<XY> q = new LinkedList<>();
        for(int i = 0; i<m; i++){
            for(int j = 0; j<n; j++){
                int size=0;
                if(picture[i][j] != 0 && visited[i][j]==0){
                    q.add(new XY(i,j,picture[i][j]));
                    visited[i][j] = 1;
                    numberOfArea++;
                }
                while(!q.isEmpty()){
                    // BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์—ญ ์ฐพ๊ธฐ
                    XY cur = q.poll();
                    size++;
                    for(int k =0; k<4; k++){
                        // dx, dy๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์œ„์น˜์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰
                        int next_x = cur.x + dx[k];
                        int next_y = cur.y + dy[k];
                        if(isIn(next_x, next_y, m, n)){
                            continue;
                        }
                        int next_v = picture[next_x][next_y];
                        if(next_v == cur.value 
                           && visited[next_x][next_y]==0){
                            q.add(new XY(next_x,next_y, next_v));
                            visited[next_x][next_y] = 1;
                        }
                    }
                }
                if(size > maxSizeOfOneArea) maxSizeOfOneArea = size;
            }
        }
        int[] answer = new int[2];
        answer[0] = numberOfArea;
        answer[1] = maxSizeOfOneArea;
        return answer;
    }
}

์–ด๋ ค์› ๋˜ ์  / ๋ฐฐ์šด ์  / ๋Š๋‚€ ์ 

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  BFS๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ธด ํ–ˆ์ง€๋งŒ, ์–ด๋””์„œ ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ง€ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰ํ•  ์ง€๋Š” ์กฐ๊ธˆ ๊ณ ๋ฏผ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ธ๋ฑ์Šค๋ฅผ ๋ฒ—์–ด๋‚œ ์—๋Ÿฌ๊ฐ€ ๋– ์„œ isIn ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๊ณ , ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค๋„ ๋ฉ”์†Œ๋“œ๋กœ ๋นผ๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, BFS ๋ถ€๋ถ„์„ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€์ˆ˜๋“ค์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•ด์ค˜์•ผํ•ด์„œ ์•ˆํ•˜๋Š”๊ฒŒ ๋” ๊น”๋”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.(ํ•„์š”์„ฑ์„ ๋ชป ๋Š๋ผ๊ฒ ๋‹ค.)

๋ฐ˜์‘ํ˜•