#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define OFFSET 2 // 테두리
int main()
{
int m = 5, n = 5, count = 0;
scanf("%d %d", &m, &n);
// 1. 메모리 할당
char** matrix = (char**)malloc(sizeof(char*)*(n + OFFSET));
for (int i = 0; i < n + OFFSET; i++)
matrix[i] = (char*)malloc(sizeof(char)*(m + 1 + OFFSET));
// 2. 데이터 입력
for (int i = 1; i < n + 1; i++)
scanf("%s", matrix[i] + 1); // matrix[i][1] ~ matrix[i][5]
if (m < 3 || m>10 || n < 3 || n>10)
return 0;
// 3. 카운팅 초기화
for (int i = 0; i < n + OFFSET; i++)
for (int j = 0; j < m + OFFSET; j++)
if (!(matrix[i][j] == '*'))
matrix[i][j] = 0;
// 4. 카운팅
for (int i = 1; i < n + 1; i++)
for (int j = 1; j < m + 1; j++)
{
int count = 0;
//if (matrix[i][j] == '*') continue;
if (!(matrix[i][j] == '*')) { // a. 위의 코드로 대체 가능
if (matrix[i + 1][j] == '*') count++;
if (matrix[i][j + 1] == '*') count++;
if (matrix[i - 1][j] == '*') count++;
if (matrix[i][j - 1] == '*') count++;
if (matrix[i + 1][j + 1] == '*') count++;
if (matrix[i - 1][j - 1] == '*') count++;
if (matrix[i - 1][j + 1] == '*') count++;
if (matrix[i + 1][j - 1] == '*') count++;
matrix[i][j] = count;
} // a.
}
// 5. 출력
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
if (matrix[i][j] == '*') printf("* ");
else printf("%d ", matrix[i][j]);
}
printf("\n");
}
// 6. 메모리 해제
for (int i = 0; i < n + OFFSET; i++)
free(matrix[i]);
free(matrix);
return 0;
}
visual studio에서는 도스창으로 잘 컴파일되고 예문이나 다른 행렬을 찍어도 되는데 심사문제에 코드를 올리면 틀렸다고 나오는 이유를 모르겠어요.
결과
*2222
3*3**
2*322
11100
00000
코드를 실행한 결과는
* 2 2 2 2
3 * 3 * *
2 * 3 2 2
1 1 1 0 0
0 0 0 0 0
문자열로 비교하므로 결과가 같아야 합니다. 공백을 제거하세요.