Algorithm/이코테

★음료수 얼려 먹기

마닐라 2021. 11. 22. 14:44

import java.util.*;

public class Main {
    public static int n;
    public static int m;
    public static int[][] arr;

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);

        n = kb.nextInt();
        m = kb.nextInt();
        kb.nextLine();
        arr = new int[n][m];

        for(int i = 0; i < n; i++) {
            String str = kb.nextLine();
            for(int j = 0; j < m; j++) {
                arr[i][j] = str.charAt(j) - '0';
            }
        }

        System.out.println(Arrays.deepToString(arr));

        //아이스크림 갯수 카운트
        int cnt = 0;

        //모든 위치에 대해 아이스크림 만들 수 있는지 확인
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(DFS(i,j)) cnt++;
            }
        }
        System.out.println(cnt);
    }

    private static boolean DFS(int x, int y) {
        //범위를 벗어나는 경우에는 바로 리턴시켜버린다.
        if(x < 0 || y < 0 || x >= n || y >= m) return false;

        //구멍이 뚫려있으면 무조건 아이스크림 만들 수 있는거니까 밑에 true 리턴
        //여러 번 호출해서 true 나 false를 리턴한다고 해도 최종적인 리턴값은 true임
        if(arr[x][y] == 0) {
            //상하좌우 탐색해서 아이스크림 만들기
            arr[x][y] = 1;
            DFS(x-1, y);
            DFS(x+1, y);
            DFS(x, y-1);
            DFS(x, y+1);
            //전부다 탐색했으면 true를 리턴해준다.
            return true;
        }
        return false;
    }
}

'Algorithm > 이코테' 카테고리의 다른 글

두 배열의 원소 교체  (0) 2021.11.23
미로 탈출  (0) 2021.11.22
게임 개발  (0) 2021.11.18
왕실의 나이트  (0) 2021.11.18
상하좌우  (0) 2021.11.18