#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
int m, n;
printf("가로 세로 입력하세요.");
scanf_s("%d %d", &m, &n);//세로 가로 입력.
char **matrix = malloc(sizeof(char*)*m);
for (int i = 0; i < m; i++)
{
matrix[i] = malloc(sizeof(char) * (n + 1)); // 행렬의 가로값 포인터 할당 문자열 null문자때문.
memset(matrix[i], 0, sizeof(char) * (n + 1)); // 행렬값 초기화
}
printf("지뢰와 지뢰가 아닌 것을 입력하세요.\n");
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
scanf_s("%s", matrix[i], sizeof(char)); // '@'지뢰, '0'지뢰없음 입력
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '0')//지뢰아니면 넘어가자.
{
continue;
}
else if (matrix[i][j] == '@')//지뢰면 탐색.
{
for (int r = j - 1; r <= j + 1; r++)
{
for (int k = i - 1; k <= i + 1; k++)
{
if((k<0||k>=i)||(r<0||r>=i))
continue;
else
matrix[i][j] += 1;
}
}
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '@')//지뢰라면
{
printf("%s ",'@');//지뢰를 출력해준다.
}
else //아니라면
{
printf("%d ",matrix[i][j]);//+1된 값을 출력해준다.
}
}
printf("\n");
}
return 0;
}
제가 입력을
@ 0 @
0 0 0
0 0 0
으로 하면
0 0 0
0 0 0
0 0 0
결과값으로 나와버립니다.
심사문제는 텍스트 일치로만 판단합니다. 따라서 안내 문구를 출력하면 안 됩니다. 프로그램을 실행해서 입력을 받는 부분은 문제의 예시처럼
5 5
*....
.*.**
.*...
.....
.....
이렇게 입력만 받아야 합니다.
문제에서 지뢰는 *로 표시합니다. 따라서 @로 문제를 풀면 안 됩니다.
입력 받을 때 scanf_s는 쓰지 마세요. 이는 C 언어 표준에 있는 함수가 아닙니다. 오직 마이크로소프트 Visual C++에서만 사용하는 비표준 함수입니다. 즉, 현업에서는 거의 안 쓰는 함수입니다. 리눅스나 맥OS에서도 실행되는 코드가 필요하다면 scanf_s는 쓰면 안 됩니다.(리눅스에서 많이 사용하는 gcc, clang에서 scanf_s는 비표준 함수이므로 지원하지 않으며 컴파일도 안 되고 에러만 발생합니다)
Unit 11에서 설명한 것처럼 Visual Studio에서는
#define _CRT_SECURE_NO_WARNINGS
를 쓰세요.
코드의 어느 부분에서 문제가 발생하는지 알아내는 방법은 Unit 6에서 설명한 디버거 사용하기를 참고하세요. 한 단계씩 실행하세요. Unit 6 내용과 동영상 강의를 한 번 보시고, 자신의 프로젝트에서 사용해보세요.
복잡하고 어려워보이지만, 복잡한 화면은 무시하고, 내가 봐야 하는 부분만 보는 법을 알면 됩니다. 디버거는 문제 해결을 도와주는 도구이고, 현업이면 대부분 쓰는 기능입니다.
scanf_s를 scanf로 수정하고 확인해보면
https://glot.io/snippets/f9gsdgg0r5
입력은
3 3
...
...
..*
출력은
46 46 42 0 0 0 0 0 0
문제가 원하는 출력은
000
001
01*
입니다. 000으로 출력해야지, 0 0 0으로 출력하면 안 됩니다.
어려우면 잠시 쉬고, 다음을 공부하다가 언젠가 돌아와서 다시 시도해보세요.