안녕하세요 38.8 문제를 풀다 시간이 너무 오래 걸려
"함께 공부해요" 카테고리에서 검색해보고 작성한 코드입니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
char** array = malloc(sizeof(char*) *m);
for (int i = 0; i < m; i++)
{
array[i] = malloc(sizeof(char) * n + 1);
memset(array[i], 0, sizeof(char) * n + 1);
}
for (int i = 0; i < m; i++)
{
scanf("%s", array[i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (array[i][j]=='*')
{
continue;
}
else if (array[i][j] == '.')
{
array[i][j] = '0';
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (array[i][j] == '*')
printf("%c", array[i][j]);
else if (array[i][j] == '0')
printf("%c", array[i][j]);
}
printf("\n");
}
for (int i = 0; i < m; i++)
{
free(array[i]);
}
free(array);
return 0;
}
이렇게 작성했을땐
*0000
0*0**
0*000
00000
00000
이런식으로 자연스럽게 출력이 되는데
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (array[i][j]=='*')
{
continue;
}
else if (array[i][j] == '.')
{
array[i][j] = '0';
}
printf("%c", array[i][j]);
}
printf("\n");
}
이런식으로 *과 .의 출력값을 정하는 구간에서 출력까지 하려고하면
0000
00
0000
00000
00000
이런식으로 출력이 되는데, 왜 이런 오류가 발생하는지 의문이 들어 질문 드립니다
코드의 디버깅에 대한 답변은 어렵습니다.
UNIT 6을 참고해서 디버거에서 중단점을 설정해서 변수 값의 변화에 따라 문제가 되는 부분을 발견하는 게 좋습니다.
포럼에서 검색해서 남겨진 코드는 정답 코드가 아니기 때문에 남겨져 있습니다. 정답 코드인 경우에는 삭제되어 있습니다. 따라서 문제 해결을 위한 시작점으로 삼기에는 안 좋은 코드입니다. 해당 코드가 남겨져 있는 이유는 이 코드의 문제점을 파악하고 해결할 수 있다면 그것 또한 좋은 연습이 될 수 있기 때문입니다. 처음부터 종이와 펜으로 로직을 구성하고 코드를 작성하는 것이 더 빠른 해결책일 수 있습니다. 실제로도 그렇습니다.
0으로 출력된다는 것은 지뢰의 개수를 카운팅하지 못한다는 것이니 해당 로직이 실행되지 않는다는 뜻입니다.
입력
5 5
*....
.*.**
.*...
.....
.....
에 대해서는
*2222
3*3**
2*322
11100
00000
이 출력되어야 합니다. 모두 0이 출력되는 것은 정상이 아닙니다.
주변 셀에서 지뢰를 찾았을 때 지뢰를 카운팅하는 로직이 필요합니다.
38.8을 해결하지 못하면 잠시 덮어두고 다음 단원으로 넘어 가는 게 좋습니다.