int main()
{
int m, n;
scanf("%d %d", &m, &n);
char** matrix = malloc(sizeof(char**) * m);
for (int i = 0; i < m; i++)
{
matrix[i] = malloc(sizeof(char*) * (n + 1));
}
for (int i = 0; i < m; i++)
{
scanf("%s", matrix[i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '*')
printf("*");
else if (matrix[i][j] == '.')
{
for (int y = i - 1; y <= i + 1; y++)
{
for (int x = j - 1; x <= j + 1; x++)
{
if (x < 0 || y < 0 || y >= m || x >= n || (x == j && y == i))
continue;
else
{
if (matrix[y][x] == '*')
{
matrix[i][j]++;
}
else if (matrix[y][x] == '.')
continue;
}
}
}
printf("%d", matrix[i][j]);
}
}
printf("\n");
}
for (int i = 0; i < m; i++)
free(matrix[i]);
free(matrix);
return 0;
}
결과값이
* 48 48 48 48
49 * 49 * *
48 * 49 48 48
47 47 47 46 46
46 46 46 46 46
이 나옵니다.
원래는
* 2 2 2 2
3 * 3 * *
2 * 3 2 2
1 1 1 0 0
0 0 0 0 0
이 나와야합니다.
그리고 심사문제 해설을 보면 memset 함수를 사용하여 메모리를 0으로 초기화 하라는데 memset( ? , 0, 1); 에서 ? 부분에 matrix를 넣어주면 될까요??
그리고 왜 memset 함수를 이용하여 메모리를 0으로 초기화해야 되나요?? 결과값을 0으로 초기화하기 위해서인가요??
포럼 상단에 38.8로 검색하면 이전 답변들을 찾아볼 수 있습니다. 이전 답변을 참조하면 좋습니다.
2차원 배열을 쓰기 때문에 matrix[i]처럼 각 배열에 대해 초기화할 필요가 있습니다.
현대 운영체제는 리눅스, 윈도, macOS 무엇을 쓰더라도 사용 후에 반납한 메모리를 삭제하지 않습니다. 간단히 말해 프로그램을 실행하고 종료한다고 프로그램이 사용한 메모리를 0으로 초기화하지 않습니다. 다른 프로그램을 실행하면 메모리를 할당하고 필요한 만큼 데이터를 쓰면 되기 때문입니다. 그래서 메모리를 할당하면 항상 쓰레기 값이 들어있습니다. 이전 프로그램이 사용했던 값이겠지요.
파일 복사에 1GB 공간을 사용했는데, 복사가 끝난 후에 운영체제가 "잠깐 기다려, 메모리 1GB 공간을 초기화하기 전에는 다른 작업 불가능"이라고 한다면 매우 느리고 불편할 것입니다. 그래서 현대 OS뿐 아니라 미래의 어떤 OS도 프로그램이 종료했다고 메모리를 초기화하지는 않습니다.
메모리를 할당하고 해당 공간 전체에 바로 값을 채울 것이면 초기화하지 않아도 됩니다.
그러나 메모리를 할당하고 공간 전체에 바로 쓰기를 하지 않는다면 초기화를 하는 것이 필요합니다.
할당한 메모리 공간을 초기화할 것인지는 프로그래머가 잘 결정해야 합니다.