#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, n;
//행렬 크기 입력받기
scanf("%d %d", &m, &n);
//입력받은 값으로 포인터에 메모리 할당하여 2차원 배열로 사용
char** matrix = malloc(sizeof(char*) * m);
for (int i = 0; i < m; i++) {
matrix[i] = malloc(sizeof(char) * (n + 1));
}
//2차원 배열에 값 할당(지뢰정보)
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] != '*')
{
matrix[i][j] = '0';
for (int num1 = -1; num1 <= 1; num1++)
{
for (int num2 = -1; num2 <= 1; num2++)
{
if (i + num1 > -1 && i + num1 <m && j + num2>-1 && j + num2 < n)
{
if (matrix[i + num1][j + num2] == '*')
matrix[i][j] += 1;
}
}
}
}
}
}
//출력
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%c ", matrix[i][j]);
}
printf("\n");
}
//값 해제하기
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
비쥬얼 스튜디오에서 출력할때는 똑같이 출력되는 것 같은데, 제출하면 틀렸다고 뜹니다ㅜㅜ 어느 부분이 잘못되었을까요?
마지막 \n을 제거한 코드도 실행시켜봤으나 이도 통과되지 않습니다ㅜㅜ
그리고 이렇게 중첩 for문을 사용하여 복잡하게 코딩하지 않고 continue를 활용하려면 어떻게 해야 할까요?
x축 y축을 한칸식 이동하기 위해 for문 두번
상하좌우의 *을 검사하기 위해 for문 두번이 필요하지 않나요?
*을 검사하는데 for문을 사용하지 않는 방법이 있는 걸까요?
아 해결했습니다.
수정가능시간이 지나서 수정이 안되네요...
continue를 사용하여 if문 중첩은 하나 줄일 수 있겠는데 코드를 더 깔끔하게 정리하는 방법 없을까요?
작은 힌트정도 주시면 감사하겠습니다^^
큰 매트릭스에서 3x3 매트릭스를 계산하는 것이라서 반복문이 4중첩으로 쓰입니다.
인공지능에서 흔히 말하는 머신 러닝, 딥러닝도 큰 매트릭스 계산에서 2x2 매트릭스 계산이라서 4중첩이고, 지뢰찾기 문제랑 비슷합니다.
경곗값을 따지는 조건식은 복잡할 수밖에 없습니다. continue를 쓰는 경우가 거의 없는데 매트릭스의 경계를 따질 때는 continue를 써서 풀이하게 됩니다. 코딩 테스트 문제로도 자주 나오는 이유이고요. 2차원 배열을 제대로 사용할 줄 아는지 묻기 좋은 문제입니다. break를 써서 풀기도 하고, continue를 써서 풀기도 합니다.
코딩 테스트에서도 break, continue를 써서 풀기를 원하니 경곗값을 잘 따지고, 조건식을 잘 쓰는 게 좋습니다. 현실에서는 더 복잡한 문제도 많습니다.
편법이 없는 건 아니나 편법으로 풀어내면 다시 break, continue를 사용한 정석적인 풀이를 요청받게 됩니다. 편법을 썼을 때의 공간 복잡도와 정석적인 풀이의 공간 복잡도에 대한 비교를 요청받을 수도 있고요. 그래서 편법보단 정석적으로 우직하게 풀어냈습니다. 공간 복잡도와 시간 복잡도는 이렇습니다. 하는 게 가장 좋습니다.