본문 바로가기
코딩/백준-자바

[자바] 백준 1652: 누울 자리를 찾아라

by 철없는민물장어 2023. 1. 16.
728x90
반응형

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

 

1652번: 누울 자리를 찾아라

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

www.acmicpc.net

 

우선 2차원배열을 만들어서 방의 구조를 그대로 저장했다.

 

이후 이중 반복문을 이용해서 누울 자리를 세면 되는데,

현재 위치와 다음 위치가 모두 빈 공간이라면 누울 수 있는 자리로 인식하면 된다.

누울 자리를 찾았다면 카운트를 증가시키고, 다음 장애물이나 벽이 나올때까지 자리를 이동한다.

 

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

public class P1652 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());

		boolean[][] room = new boolean[n][n];
		for (int i = 0; i < n; i++) {
			String str = br.readLine();
			for (int j = 0; j < n; j++) {
				if (str.charAt(j) == '.') {
					room[i][j] = false;
				} else {
					room[i][j] = true;
				}
			}
		}

		int row = 0, col = 0;

		for (int i = 0; i < n; i++) {
			int j = 0;
			while (j < n - 1) {
				if (!room[i][j] && !room[i][j + 1]) {
					// 누울 수 있는경우
					row++;
					while (j < n - 1 && !room[i][j]) {
						j++;
					}
				}
				j++;
			}
		}
		for (int i = 0; i < n; i++) {
			int j = 0;
			while (j < n - 1) {
				if (!room[j][i] && !room[j + 1][i]) {
					// 누울 수 있는경우
					col++;

					while (j < n - 1 && !room[j][i]) {
						j++;
					}

				}
				j++;
			}
		}

		System.out.println(row + " " + col);
	}

}

 

나는 문제에 있는 예시만 보고

한 행에는 가로로 누울 수 있는 자리가 최대 1개라고 생각했는데, 그렇지 않다.

 

예를 들어 어떠한 행이 [..x..x..x..] 라고 하자

그럼 가로로 누울 수 있는 자리가 4개나 된다.

이렇게 여러 공간으로 나뉘는 경우에도 계산할 수 있도록

while문을 하나 더 추가하여 장애물이 나올때까지 j를 증가시켰다.

728x90
반응형

댓글