ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)2667 - 단지번호붙이기
    PS/boj 2020. 9. 3. 16:02
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
    
    public class Main {
        static int n, danjiCnt;
        static int[][] graph = new int[26][26];
        static int[] num = new int[26*26];
    
        static boolean dfs (int x, int y) {
            if (x < 1 || x > n || y < 1 || y > n) {
                return false;
            }
    
            // 단지가 될 수 있다면
            if (graph[x][y] == 1) {
                graph[x][y] = 0;
                num[danjiCnt]++;
    
                dfs(x - 1, y);
                dfs(x + 1, y);
                dfs(x, y - 1);
                dfs(x, y + 1);
    
                return true;
            }
    
            return false;
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            n = Integer.parseInt(br.readLine());
    
            // graph 입력
            for (int i = 1; i <= n; i++) {
                String str = br.readLine();
                for (int j = 1; j <= n; j++) {
                    graph[i][j] = str.charAt(j-1) - '0';
                }
            }
    
            // graph 순회하면서 dfs 실행
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (dfs(i, j)) {
                        danjiCnt++;
                    }
                }
            }
    	       
            // 출력 
            System.out.println(danjiCnt);
            Arrays.sort(num);
            for (int value : num) {
                if (value != 0) {
                    System.out.println(value);
                }
            }
            
        }
    }
    

    - 얼음 채우기에서 봤던 느낌이랑 비슷해서 DFS로 접근했다.

    - 삽질하면서 시간도 많이쓰고 정답을 맞추긴했는데 버거웠따 ...

    - 바로 넘어가지말고 다른 사람풀이를 봐서 생각 따라가는거 연습해보자

     

     

    1. 사용 할 변수 선언

    1-1) int n, danjiCnt / int[26][26] graph 

    int num[26*26] : 처음엔 num[26]이었고 런타임오류가 떠서 다시 코드를봤는데 26으로 하면 25x25로 가장 큰 배열일때

    그 danjiCnt 가 26을 넘어버릴수도 있기에 크게 잡음. 약간 낭비일수도있는데 몇으로 잡아야 할지 생각이 안났다.

     

    2. 입력받고 dfs 함수 생성

    2-1) 상하좌우로 움직일건데 만약에 x, y가 graph의 범위를 넘을경우 false

    2-2) 그래프 탐색부분이 1일경우에 거기서 부터 같은 단지를 전부 탐색하기 위해 상하좌우로 dfs 호출

    2-3) 이미 방문한곳은 0으로 만들어주고 num[danjiCnt]++;을 해준다 -> 한 단지에 있는 아파트 수 카운팅

     

    3. 메인함수에서 dfs 호출

    3-1) 모든 배열에서 dfs를 돌아야하니까 이중 for문 사용

    3-2) 만약에 dfs 함수가 true값을 반환하면 하나의 단지를 이뤘다는거니까 danjiCnt++;

     

    4. 출력

    4-1) 단지수 호출

    4-2) 단지별 아파트를 오름차순으로 출력해야 하기에 Arrays.sort()로 오름차순 정렬후 0이 아닌 값을 출력

     

     


    www.acmicpc.net/problem/2667

    'PS > boj' 카테고리의 다른 글

    boj)2178 - 미로 탐색  (0) 2020.09.03
    boj)1012 - 유기농 배추  (0) 2020.09.03
    boj)2606 - 바이러스  (0) 2020.09.03
    boj)1260 - DFS와 BFS  (0) 2020.09.03
    boj)18352 - 특정 거리의 도시 찾기  (0) 2020.09.02
킹수빈닷컴