궤도

[EPPER] 10회 7번 본문

💻 현생/⛓ 알고리즘

[EPPER] 10회 7번

영이오 2020. 10. 8. 23:34

문제

 


풀이

 

이 문제는 한가지만 떠올리면 난이도가 아주 낮아진다. 바로 테두리를 두르는 것이다.

이렇게 말이다. 왜냐면 왼쪽 그대로 입력을 받아 문제를 풀면 테두리에 있는 지역을 계산하기 위한 함수를 따로 만들어야 한다. 하지만 오른쪽으로 입력을 받으면 어느 지점을 골라도 해당 지역을 중심으로 한 3x3 사각형이 있으니 함수를 하나만 써도 된다.

 

이것도 character이니 입력을 받을 때 공백(엔터)를 처리해 줄 empty 변수를 잊지 말자. *인 부분은 그대로 출력하고 -인 부분에 대해서는 fidZ 함수를 호출한다. 좌표가 (x, y)일 때 해당 좌표를 중심으로 한 3x3 사각형의 좌표는 (x-1~x+1, y-1~y+1)이므로 해당 부분을 탐색하며 지뢰의 수를 계산한다. 물론 나 자신을 세는 경우를 빼긴 했는데, 지금 생각해보니 나 자신이 지뢰라면 애시당초 findZ 함수를 호출하지 않았을 테니 필요 없었을 것 같다. 저 부분에서 뻘짓을 좀 했었는데 이제와서야 필요 없었던 부분이라고 생각하니 억울하다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

char matrix[101][101];
int m, n;

int findZ(int x, int y) { //지뢰 갯수 찾는 함수
	int sum = 0;
	
	for (int i = x - 1; i <= x + 1; i++) {
		for (int j = y - 1; j <= y + 1; j++) {
			if ((i != x || j != y) && (matrix[i][j] == '*'))
				sum++;
		}
	}
	return sum;
}

int main() {
	char empty, input;

	scanf("%d %d", &m, &n);
	for (int i = 0; i < m + 2; i++) { //편하게 하기 위해 테두리를 하나 더 둘러줌
		for (int j = 0; j < n + 2; j++) {
			matrix[i][j] = '-';
		}
	}
	scanf("%c", &empty);
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			scanf("%c", &input);
			matrix[i][j] = input;
		}
		scanf("%c", &empty);
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (matrix[i][j] == '*')
				printf("*");
			else
				printf("%d", findZ(i, j));
		}
		printf("\n");
	}
}
Comments