ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 양 한마리... 양 두마리...
    알고리즘/백준 2020. 6. 18. 15:15
    반응형

    양 한마리... 양 두마리...

     

    11123번: 양 한마리... 양 두마리...

    문제 얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지.  그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세�

    www.acmicpc.net

    풀이

     

    프로그래머스에서 grouping을 이용하는 문제를 풀어봤어서, 금방 풀었다.

    내가 푼 방식은 각 위치에서 양이 있는 자리일 때, 그룹이 지정됐는지 여부를 확인하고 그룹화를 해주는 것이다.

    그룹의 인덱스를 1부터 시작하면서, grouping을 해줄 때 마다, 그룹의 인덱스를 1씩 증가시켜주었다.

    grouping이 끝나고 나면 group의 인덱스 = 그룹의 갯수+1 가 저장되어 있기 때문에, group 인덱스 -1을 출력하면서 답을 구해주었다.

    우선순위에 따라 순수하게 DFS로만 풀어도 괜찮고, 지금과 같이 일정 구간에 대해 큐로 풀어도 괜찮다.

    개인적으로는 큐로 푸는게 더 간단하다는 생각이 들어서 LinkedList를 애용하고 있다.

     

    로직

     

    1. 입력받는 Map을 2차원 char 배열 혹은 1차원 String 배열에 저장해준다.

     (최대 100 by 100 이기 때문에, char 배열로 저장해서 접근하는게 퍼포먼스가 더 좋을 것이라 판단했다.)

    2. 맵을 돌면서 양이 있는 구역을 확인한다.

     2-1. grouping이 안되어있다면, 해당 위치에서 상하좌우를 탐색하면서 grouping을 해준다.

    3. group Idx는 1부터 시작했기 때문에, 모든 맵을 탐색한 이후에는 group의 수 +1 가 저장되어 있을 것이다. 따라서, idx -1을 출력해준다.

     

    코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    public class SheepGroup_11123 {
        final static char sheep = '#';
        final static int[] dx = {1,0,-1,0}, dy = {0,1,0,-1};
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            ArrayList<char[][]> sheepList = new ArrayList<>();
            int cases = Integer.parseInt(br.readLine());
    
            for(int i=0; i<cases; i++) {
                String sizeInfo = br.readLine();
                int ySize = Integer.parseInt(sizeInfo.split(" ")[0]);
    
                char[][] map = new char[ySize][];
    
                for(int y=0; y<ySize; y++) {
                    map[y] = br.readLine().toCharArray();
                }
                sheepList.add(map);
            }
    
            solution(sheepList);
    
            br.close();
        }
    
        private static void solution(ArrayList<char[][]> sheepList) {
            for(char[][] sheepMap : sheepList) {
                int ySize = sheepMap.length;
                int xSize = sheepMap[0].length;
                int[][] group =new int[ySize][xSize];
                int idx =1;
    
                for(int y=0; y<ySize; y++) {
                    for(int x=0; x<xSize; x++) {
                        if(sheepMap[y][x] == sheep && group[y][x] ==0) {
                            group = groupingSheep(group, sheepMap, idx++, x, y);
                        }
                    }
                }
                System.out.println(idx-1);
            }
        }
    
        private static int[][] groupingSheep(int[][] group, char[][] sheepMap, int idx, int x, int y) {
            LinkedList<int[]> moveList = new LinkedList<>();
            moveList.offer(new int[]{x,y});
            group[y][x] = idx;
    
    
            while(!moveList.isEmpty()) {
                int[] pos = moveList.poll();
    
                for(int i=0; i<4; i++) {
                    int nx = pos[0] + dx[i];
                    int ny = pos[1] + dy[i];
    
                    if(isInArea(nx,ny,sheepMap[0].length, sheepMap.length)) {
                        if(sheepMap[ny][nx] == sheep && group[ny][nx] ==0) {
                            moveList.offer(new int[] {nx,ny});
                            group[ny][nx] = idx;
                        }
                    }
                }
            }
            return group;
        }
    
        private static boolean isInArea(int x, int y, int maxX, int maxY) {
            return x>=0 && x<maxX && y>=0 && y<maxY ? true : false;
        }
    }
    // https://www.acmicpc.net/problem/11123
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 대회 개최  (0) 2020.06.18
    BOJ) 방법을 출력하지 않는 숫자 맞추기  (0) 2020.06.18
    BOJ) 자동차경주대회  (0) 2020.06.18
    BOJ) 다음수  (0) 2020.06.13
    BOJ) 빗물  (0) 2020.06.13

    댓글

Designed by Tistory.