회신: 38.8 지뢰찾기 문제 질문
, 도장_ 관리자님이 작성예제 입력
3 3
*..
...
...
문의한 코드의 출력
* 0 0
1 0 0
0 0 0
올바른 정답
*10
110
000
2차원 배열을 잘 이용해야 합니다.
주변에 있는 지뢰의 개수를 카운트해야 합니다. 지뢰의 개수가 제대로 카운트되지 않는 것은 코드가 의도한 대로 동작하지 않는다는 뜻입니다. 위 예시처럼 가장 간단한 케이스(지뢰가 1개 뿐인 경우)를 먼저 테스트하세요.
결과에는 공백 없이 출력해야 합니다.
* 0 0이 아니라 *00처럼 공백이 없어야 합니다.
Unit 38.4의 예제 코드를 보면
int row, col;
scanf("%d %d", &row, &col);
int **m = malloc(sizeof(int *) * row); // 이중 포인터에 (int 포인터 크기 * row)만큼
// 동적 메모리 할당. 배열의 세로
for (int i = 0; i < row; i++) // 세로 크기만큼 반복
{
m[i] = malloc(sizeof(int) * col); // (int의 크기 * col)만큼 동적 메모리 할당. 배열의 가로
}
for (int i = 0; i < row; i++) // 세로 크기만큼 반복
{
for (int j = 0; j < col; j++) // 가로 크기만큼 반복
{
m[i][j] = i + j; // 2차원 배열의 각 요소에 i + j 값을 할당
}
}
가로 -> 세로, 즉 row -> col 순서입니다. 문의한 코드는 반대입니다.
Unit 6의 디버거를 사용해보세요. Visual Studio 프로젝트에서 F10으로 프로시저 단위로 실행하며 배열과 값을 추적할 수 있습니다.
문자는 끝에 NULL 문자가 필요합니다.
m[i] = malloc(sizeof(char*) * col);이 부분을
m[i] = malloc(sizeof(char*) * col + 1);
이와 같이 끝에 + 1을 해주면 됩니다. (col + 1)은 sizeof(char*)이 1이므로 우연의 일치로 동작할 뿐입니다.
memset으로 초기화해주세요.