질문) 지뢰 주변에 숫자가 도저히 더해지지 않습니다.
포럼에서 글도 찾아보고 구글링도 해봤는데 도저히 모르겠습니다 ㅠㅠ
#define _CRT_SECURE_NO_WARNING // scanf함수 포함 헤더파일
#include <stdio.h> // printf함수 포함 헤더파일
#include <stdlib.h> // malloc, memset함수 포함 헤더파일
int main()
{
int m, n; // 행렬의 세로(m), 가로(n) 함수 선언
scanf("%d %d", &m, &n); // 행렬의 세로(m), 가로(n)값 입력
char **matrix = malloc(sizeof(char *) * m); // 행렬의 세로값 포인터 할당
for (int i = 0; i < m; i++)
{
matrix[i] = malloc(sizeof(char) * (n + 1)); // 행렬의 가로값 포인터 할당
memset(matrix[i], 0, 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] == '*') // '*'발견시 건너뜀
continue;
else
{
matrix[i][j] = 0; // '.'지뢰없음값 0으로 초기화
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++) // 행렬 탐색
{
if (matrix[i][j] == 0) // '.'지뢰없음값 발견시
{
for (int y = i - 1; y >= i + 1; y++) // 탐색할 세로 범위
{
for (int x = j - 1; x >= j + 1; x++) // 탐색할 가로 범위
{
if (x < 0 || x >= j || y < 0 || y >= j) // 배열범위 초과값 건너뜀
continue;
else if (matrix[y][x] == '*') // 탐색범위에서 '*'지뢰 발견시
{
matrix[i][j] += 1; // 최초 지뢰없음칸에 +1 합산
}
}
}
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++) // 행렬 탐색
{
if (matrix[i][j] == '*') // '*'지뢰 발견시
printf("*"); // '*' 출력
else
printf("%d", matrix[i][j]); // 지뢰 주변 합산값 출력
}
printf("\n");
}
for (int i = 0; i < m; i++)
free(matrix[i]);
free(matrix);
return 0;
}
입력 예)
3 3
*..
...
...
출력)
*00
000
000
-. Unit 6을 참고해 디버거를 이용하세요.
-. 코드의 변경 조건
if (x < 0 || x >= j || y < 0 || y >= j) // 배열범위 초과값 건너뜀
continue;
else if (matrix[y][x] == '*') // 탐색범위에서 '*'지뢰 발견시
{
matrix[i][j] += 1; // 최초 지뢰없음칸에 +1 합산
}
행렬의 값을 변경하는 유일한 부분이 else if입니다. 이 부분이 한 번도 실행되지 않아서 결과에도 변경이 없는 것입니다.
디버거로 if 부분에 중단점을 설정해서 실제 조건이 어떻게 판별되는지 확인하세요.
-. 건너 뛴다
38.8은 처음 풀기에는 어려운 문제입니다. 학습을 계속하다가 나중에 다시 시도해보는 것이 좋습니다.
지뢰 찾기는 입사 시험 단골 출제 문제입니다. 졸업반 정도의 실력이면 충분히 풀 수 있습니다.