ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 누울 자리를 찾아라
    알고리즘/백준 2020. 8. 26. 15:46
    반응형

    누울 자리를 찾아라

     

    1652번: 누울 자리를 찾아라

    첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.

    www.acmicpc.net

    풀이

     

    세로와 가로를 직접 검증하는 메소드 두 개를 만들어서 쉽게 풀었다.

    하지만, 기준점이 되는 좌표를 정하는 메소드로 만들었으면, 코드를 더 줄이고 중복을 줄일 수 있었을텐데 아쉽다.

    확실히 문제 풀 때는 거기까지 생각하기는 힘든 것 같다.

     

    아무튼, 내가 푼 방법은 가로와 세로 좌표를 각각 순차적으로 돌면서 다음 좌표가 빈칸인지 확인하며, 빈칸일 때까지 쭉 이어나가는? 방법이다. map에 직접 하는게 편하겠지만, 가로와 세로 각각 탐색해야하기 때문에 map을 건드릴 수 없었고, deep clone을 하는 것 보다는 visit을 만드는게 더 효율적이라고 생각했다.

     

    가로에서는 x를 우선적으로 확인하고, 세로는 y를 우선적으로 확인했다는 점과 기준 축에서 계속해서 다음 좌표가 비어있는지 확인했다는 점 두 개 말고는 특이사항은 없다.

     

     

    코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
        final static char EMPTY ='.';
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(br.readLine());
            char[][] map = new char[n+1][n+1];
            for(int i=0; i<n; i++) {
                char[] charArr = br.readLine().toCharArray();
                for(int j=0; j<n; j++)  map[i][j] = charArr[j];
            }
            br.close();
            solution(n, map);
        }
    
        private static void solution(int n, char[][] map) {
            StringBuffer sb = new StringBuffer();
            sb.append(getHorizontal(n, map)).append(" ");
            sb.append(getVertical(n, map));
            System.out.println(sb.toString());
        }
    
        private static int getVertical(int n, char[][] map) {
            boolean[][] visit = new boolean[n+1][n+1];
            int answer =0;
            for(int x=0; x<n; x++) {
                for(int y=0; y<n; y++) {
                    if(map[y][x] == EMPTY && !visit[y][x]) {
                        visit[y][x] = true;
                        int nextY = y + 1;
                        while (map[nextY][x] == EMPTY) {
                            visit[nextY][x] = true;
                            nextY++;
                        }
                        if(visit[y+1][x])   answer++;
                    }
                }
            }
            return answer;
        }
    
        private static int getHorizontal(int n, char[][] map) {
            boolean[][] visit = new boolean[n+1][n+1];
            int answer =0;
            for(int y=0; y<n; y++) {
                for(int x=0; x<n; x++) {
                    if(map[y][x] == EMPTY && !visit[y][x]) {
                        visit[y][x] = true;
                        int nextX = x + 1;
                        while (map[y][nextX] == EMPTY) {
                            visit[y][nextX] = true;
                            nextX++;
                        }
                        if(visit[y][x+1])   answer++;
                    }
                }
            }
            return answer;
        }
    
        private static class Pos {
            int x,y;
            public Pos(int x, int y) {
                this.x =x;
                this.y =y;
            }
        }
    }
    반응형

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

    BOJ) 토너먼트  (0) 2020.08.27
    BOJ) 점프  (0) 2020.08.27
    BOJ) 섬의 개수  (0) 2020.08.26
    BOJ) 수 찾기  (0) 2020.08.26
    BOJ) 가장 큰 정사각형  (0) 2020.08.26

    댓글

Designed by Tistory.