알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 1652번: 누울 자리를 찾아라

K.두부 2022. 9. 26. 23:21
반응형

https://www.acmicpc.net/problem/1652

 

1652번: 누울 자리를 찾아라

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

www.acmicpc.net

풀이

dfs, bfs 문제처럼 보이지만 쉽게 풀 수 있는 문제이다.

 

문제의 조건은 아래와 같다.

 

1. 2칸 이상의 빈 칸이 있으면 누울 수 있다.

2. 반드시 벽이나 짐에 닿게 된다.

 

이중 for문을 돌리면서 가로, 세로에 연속 2칸이 비어있으면 cnt++을 해준 후에 break; 문으로 for문을 빠져나왔다. 

하지만 이렇게 하니까 예외 상황이 하나 생겼다.

바로 한 줄에 2개의 자리가 생길 수 있다는 점이다. 이 상황만 신경써서 코드를 구현한다면 큰 어려움없이 해결할 수 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    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][N];
		
        for (int i=0; i<N; i++) {
            String str = br.readLine();
            for (int j=0; j<N; j++) {
                map[i][j] = str.charAt(j);
            }
        }
		
        int x_cnt = 0;
        int y_cnt = 0;
        int x_tmp = 0;
        int y_tmp = 0;
		
        for (int i=0; i<N; i++) {
            for (int j=0; j<N; j++) {
                if (map[i][j] == '.') {
                    x_tmp++;
					
                    if (x_tmp == 2) x_cnt++;
                } else {
                    x_tmp = 0;
                }
            }
            x_tmp = 0;
        }
		
        for (int i=0; i<N; i++) {
            for (int j=0; j<N; j++) {
                if (map[j][i] == '.') {
                    y_tmp++;
					
                if (y_tmp == 2) y_cnt++;
                
                } else {
                    y_tmp = 0;
                }
            }
			
            y_tmp = 0;
        }
		
        System.out.println(x_cnt + " " + y_cnt);
    }
}

 

반응형