Study/Algorithm

BOJ (C/C++) 1652번: 누울 자리를 찾아라

hwooo 2023. 6. 22. 02:51


풀이

한 줄에 연속해서 2칸 이상의 빈 칸이 존재하면 누울 수 있다.

이 때 ..X.. 과 같이 X를 중간에 두고 2칸 이상이 있다면 이는 누울 수 있는 자리를 2개로 해석해야 한다.

....X, ...X., .X...과 같은 경우는 1개. 문제 설명이 애매해서 해당 부분에서 헷갈렸다.

 

한 줄씩 가로 세로로 탐색하며 누울 수 있는 경우 카운트 해줬고, 중간에 벽이 나올 경우에만 재카운트가 가능하게 코드를 짰다.


코드

#include <stdio.h>
bool map[100][100];
int main() {
	int N, garo = 0, sero = 0;
	char s[101];

	// input
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%s", &s);
		for (int j = 0; j < N; j++) {
			if (s[j] == 'X') map[i][j] = true;
		}
	}


	for (int i = 0; i < N; i++) {
		// 가로
		bool is_wall = true;
		for (int j = 0; j < N - 1; j++) {
			if (is_wall && !map[i][j] && !map[i][j + 1]) {
				garo++; is_wall = false;
			}
			// 중간에 벽
			if (map[i][j]) is_wall = true;
		}

		// 세로
		is_wall = true;
		for (int j = 0; j < N - 1; j++) {
			if (is_wall && !map[j][i] && !map[j + 1][i]) {
				sero++; is_wall = false;
			}
			if (map[j][i]) is_wall = true;
		}
	}

	printf("%d %d", garo, sero);
	return 0;
}