게시판

검색 결과: 188

 

큰 매트릭스에서 3x3 매트릭스를 계산하는 것이라서 반복문이 4중첩으로 쓰입니다.

인공지능에서 흔히 말하는 머신 러닝, 딥러닝도 큰 매트릭스 계산에서 2x2 매트릭스 계산이라서 4중첩이고, 지뢰찾기 문제랑 비슷합니다.

경곗값을 따지는 조건식은 복잡할 수밖에 없습니다. continue를 쓰는 경우가 거의 없는데 매트릭스의 경계를 따질 때는 continue를 써서 풀이하게 됩니다. 코딩 테스트 문제로도 자주 나오는 이유이고요. 2차원 배열을 제대로 사용할 줄 아는지 묻기 좋은 문제입니다. break를 써서 풀기도 하고, continue를 써서 풀기도 합니다.

코딩 테스트에서도 break, continue를 써서 풀기를 원하니 경곗값을 잘 따지고, 조건식을 잘 쓰는 게 좋습니다. 현실에서는 더 복잡한 문제도 많습니다.

편법이 없는 건 아니나 편법으로 풀어내면 다시 break, continue를 사용한 정석적인 풀이를 요청받게 됩니다. 편법을 썼을 때의 공간 복잡도와 정석적인 풀이의 공간 복잡도에 대한 비교를 요청받을 수도 있고요. 그래서 편법보단 정석적으로 우직하게 풀어냈습니다. 공간 복잡도와 시간 복잡도는 이렇습니다. 하는 게 가장 좋습니다.


, 김 지연님이 작성
 

아 해결했습니다.

수정가능시간이 지나서 수정이 안되네요...


continue를 사용하여 if문 중첩은 하나 줄일 수 있겠는데 코드를 더 깔끔하게 정리하는 방법 없을까요?

작은 힌트정도 주시면 감사하겠습니다^^


, 김 지연님이 작성
 

아 해결했습니다.

수정가능시간이 지나서 수정이 안되네요...


continue를 사용하여 if문 중첩은 하나 줄일 수 있겠는데 코드를 더 깔끔하게 정리하는 방법 없을까요?

작은 힌트정도 주시면 감사하겠습니다^^

, 김 지연님이 작성
 

#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문을 사용하지 않는 방법이 있는 걸까요?

, 도장_ 관리자님이 작성
 

main.c:14:2: warning: implicit declaration of function 'scanf_s' is invalid in C99 [-Wimplicit-function-declaration]
        scanf_s("%d", &num);


scanf_s는 비표준이므로 쓰면 안 됩니다. Visual Studio 외에는 지원하지 않습니다. 대다수 온라인 심사는 리눅스 환경이고 GCC나 Clang을 씁니다. 이들 컴파일러는 scanf_s를 지원하지 않습니다.

scanf로 고쳐도 에러는 계속 발생합니다.


main.c:22:5: error: use of undeclared identifier 'i'
                m[i] = malloc(sizeof(int) * num);
                  ^
Visual Studio에서도 공통인데 이 경우엔 그 위에 코드가 문제인 경우도 종종 있습니다.

    for (int i = 0; i < num; i++);
    {

        m[i] = malloc(sizeof(int) * num);

    }


for 문 뒤에 ;이 있습니다. 그러면 블록이 없이 끝나는 한 줄짜리 for 반복문이 됩니다. 그러면 for 블록의 범위는 끝난 것이고, for 문은 종료된 것이므로 for 문 안에서 int i로 선언한 변수 i도 사라집니다. 그게 변수 i는 선언되지 않았다는 오류 메시지의 이유입니다.


이런 식으로 하나씩 살펴보면서 디버깅을 해야 합니다.

UNIT 6 디버거를 사용하거나 포럼 상단에 있는 시각화 사이트를 이용하세요.

UNIT 번호는 38.8입니다. 포럼 오른쪽 상단 검색 상자에 38.8로 검색해서 이전 질문과 답변을 참조하는 것도 방법입니다.

심사문제를 제출했을 때 나오는 해설을 보세요. int **m으로는 숫자 행렬인데, 해설에서는 char **m으로 되어 있습니다. 행렬의 값에는 숫자, '.', '*'이 들어갑니다. 문자와 숫자 모두 들어갑니다. 숫자만 있는 행렬이면 문자를 별도로 처리해야 합니다. 내부적으로 값이 11이면 화면에는 .으로 출력하고, 값이 12이면 *로 출력하는 식의 전처리를 거치는 방식으로 코드를 작성할 수는 있지만, 문제 해결이 어렵겠지요.

그러면 처음 행렬을 입력 받을 때 지뢰 위치로 *이 입력되면 내부에서는 12로 처리해야 한다거나 하는 식의 과정이 추가로 필요합니다. 코드를 더 복잡하게 만드는 요인이 됩니다.

해설을 참고해서 해설에서 제시하는 방법을 이해하면서 코드를 작성하려고 해보세요.



 
포럼 상단 고정에 있는 온라인 시각화를 이용하세요.
온라인 시각화에 만든 코드는 다음과 같습니다. 링크 클릭하세요.
사용자 입력은 제한되어 있으니 입력은 제거하고, 직접 입력하는 것으로 변경했습니다.

3 3
...
*..
..*
이렇게 입력한 것을 가정해서 코드를 만들었습니다. 고정된 값에서 잘 된다면 그 다음에 입력 값을 받아서 동적으로도 잘 동작하게 만들면 됩니다.
https://pythontutor.com/render.html#code=%23define%20_CRT_SECURE_NO_WARNINGS%0A%0A%23include%20%3Cstdio.h%3E%0A%0A%23include%20%3Cstdlib.h%3E%0A%0A%23include%20%3Cstring.h%3E%0A%0A%0Aint%20main%28%29%0A%0A%7B%0A%0A%20%20%20%20int%20m,%20n%3B%0A%0A%0A%20%20%20%20m%20%3D%203%3B%0A%20%20%20%20n%20%3D%203%3B%0A%0A%0A%20%20%20%20char%20**matrix%20%3D%20malloc%28sizeof%28char%20*%29%20*%20m%29%3B%0A%0A%0A%20%20%20%20for%20%28int%20i%20%3D%200%3B%20i%20%3C%20m%3B%20i%2B%2B%29%0A%0A%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20matrix%5Bi%5D%20%3D%20malloc%28sizeof%28char%29%20*%20%28n%20%2B%201%29%29%3B%0A%0A%20%20%20%20%20%20%20%20memset%28matrix%5Bi%5D,%200,%20sizeof%28char%29%20*%20%28n%20%2B%201%29%29%3B%0A%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20matrix%5B0%5D%20%3D%20%22...%22%3B%0A%20%20%20%20matrix%5B1%5D%20%3D%20%22*..%22%3B%0A%20%20%20%20matrix%5B2%5D%20%3D%20%22..*%22%3B%0A%0A/*%0A%20%20%20%20for%20%28int%20i%20%3D%200%3B%20i%20%3C%20m%3B%20i%2B%2B%29%0A%0A%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20scanf%28%22%25s%22,%20matrix%5Bi%5D%29%3B%0A%0A%20%20%20%20%7D%0A*/%0A%0A%20%20%20%20for%20%28int%20i%20%3D%200%3B%20i%20%3C%20m%3B%20i%2B%2B%29%0A%0A%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20for%20%28int%20j%20%3D%200%3B%20j%20%3C%20n%3B%20j%2B%2B%29%0A%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28matrix%5Bi%5D%5Bj%5D%20%3D%3D%20'*'%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20printf%28%22%25c%22,%20matrix%5Bi%5D%5Bj%5D%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix%5Bi%5D%5Bj%5D%20%3D%200%3B%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28int%20x%20%3D%20i%20-%201%3B%20i%20%3C%3D%20i%20%2B%201%3B%20x%2B%2B%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28int%20y%20%3D%20j%20-%201%3B%20y%20%3C%3D%20j%20%2B%201%3B%20y%2B%2B%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28x%20%3C%200%20%7C%7C%20x%20%3E%3D%20m%20%7C%7C%20y%20%3C%200%20%7C%7C%20y%20%3E%3D%20n%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28matrix%5Bx%5D%5By%5D%20%3D%3D%20'*'%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix%5Bi%5D%5Bj%5D%20%2B%3D%201%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20printf%28%22%25d%22,%20matrix%5Bi%5D%5Bj%5D%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%7D%0A%0A%0A%20%20%20%20%20%20%20%20printf%28%22%5Cn%22%29%3B%0A%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20for%20%28int%20i%20%3D%200%3B%20i%20%3C%20m%3B%20i%2B%2B%29%0A%0A%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20free%28matrix%5Bi%5D%29%3B%0A%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20free%28matrix%29%3B%0A%0A%0A%20%20%20%20return%200%3B%0A%0A%0A%7D&cumulative=false&curInstr=17&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=%5B%5D&textReferences=false


Next 버튼을 클릭해서 실행해보세요.

여기까지가 루프 진입 전입니다.
여기서부터 하나씩 실행 단계를 보면서 시각적으로 이해하고 코드의 문제를 해결해보세요.

, 김 서이님이 작성
 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int main()

{

int m, n;


scanf("%d %d", &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] == '*')

{

printf("%c", matrix[i][j]);

continue;

}

else

{

matrix[i][j] = 0;


for (int x = i - 1; i <= i + 1; x++)

{

for (int y = j - 1; y <= j + 1; y++)

{

if (x < 0 || x >= m || y < 0 || y >= n)

continue;

else if (matrix[x][y] == '*')

{

matrix[i][j] += 1;

}

}

}


printf("%d", matrix[i][j]);

}

}


printf("\n");

}


for (int i = 0; i < m; i++)

{

free(matrix[i]);

}


free(matrix);


return 0;


}


코드를 이렇게 짜봤는데 실행하면 '*'는 잘 출력되는데 '.' 관련해서 처리하는 코드가 잘못된건지 '*'가 아닌건 출력이 안되네요... 뭐가 문제인 걸까요?

, 도장_ 관리자님이 작성
 

포럼 오른쪽 상단에 38.8로 검색하면 이전 질문과 답변도 참조할 수 있습니다.


, 도장_ 관리자님이 작성
 

UNIT 6을 학습하고, 디버거를 사용하는 게 좋습니다.

일단, 코드를 컴파일하고 입력을 넣어보고

엔터를 한 번 더 입력하면 에러가 발생하고 중단됩니다.

0만 출력하고 중단된 상태

이 상태에서도 변수의 값을 확인할 수 있습니다.

예외를 보면 "위치를 읽는 동안 액세스 위반이 발생했습니다"입니다.

Visual Studio 아래를 보면 조사식 창이 뜨는데 로컬 탭을 선택합니다.

그러면 변수의 값을 볼 수 있습니다.

m은 3인데, i는 2147483647입니다.

i 값이 이상하다는 것을 알 수 있습니다.

"변수가 최적화되어 사용할 수 없습니다."는 최적화가 실행인데...

빌드가 Release 빌드라서 그렇습니다(사용자마다 환경에 차이가 있습니다)

빌드를 Debug로 바꾸고 예제를 다시 실행합니다.

가운데 Debug로 선택을 바꿉니다.

변수 값이 제대로 나오는데,

i는 항상 214748647입니다.

프로그램 실행 시간이 오래 걸리는 것을 보면 반복문을 214748647번 반복하는 것으로 보입니다.

코드에서 중단 조건이 제대로 동작하지 않는 것으로 보입니다.

이런 건 로직을 종이와 펜으로 정리하고 코딩하는 게 좋습니다. 코드만 무조건 고쳐본다고 문제가 해결되지 않습니다.


디버그를 중단하고 디버그 메뉴에서 한 단계씩 코드 실행, F11입니다.

F11로 단계별로 실행하면서 값을 입력하고 나면

이렇게 i = 0, j = 0까지 진입하고 안쪽 루프 실행을 단계별로 볼 수 있습니다.

이런식으로 실행해보면 됩니다.

여기만 반복해서 실행하는 걸 볼 수 있습니다.


코드의 디버깅은 각자 해야 합니다.

UNIT 6에서 디버거 사용법을 익히고, 천천히 해결해보세요.

종이와 펜은 매우 강력한 도구입니다.

경우의 수를 나눠보고 모서리에 위치한 칸에서 지뢰를 찾을 때 경계를 넘지 않으려면 어떻게 해야 하는지 펜으로 정리해야 합니다.

종이와 펜이 없으면 코드에 주석이라도 제대로 달아서 보기 쉽게 해야 고치기가 쉽습니다.

F11로 계속 실행해보면 안쪽에서만 반복하고 있고, i = 2인데 k = -1입니다.

continue나 break는 중첩 루프일 때 안쪽 루프만 흐름을 제어하지 바깥쪽 루프의 흐름을 제어하지 않습니다.


, 장 경태님이 작성
 
지뢰찾기 문제를 나름대로 하던 중

코드를 아래와 같이 작성하였습니다.

그러나, 프로그램이 실행되다가 끝나지 않아 

어느 부분이 잘못되었는지 피드백을 듣고 싶습니다.

1시간째 봐도 왜 제눈엔 안보일까요 ㅠ

피드백이나 조언 부탁드립니다.

----------------------------------------------------------------------------

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int main()

{

int m, n;

int sum = 0;


scanf("%d %d", &m, &n);


char** matrix = malloc(sizeof(char*) * m);


for (int i = 0; i < (n + 1); 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 + 1); j++)

{

if (matrix[i][j] == '*')

{

printf("%c", '*');

continue;

}

else {

for (int k = i - 1; k <= (i + 1); i++)

{

for (int p = j - 1; p <= (j + 1); p++)

{

if (k < 0 || p < 0)

continue;

else if (k > m || p > (n + 1))

continue;

else if (matrix[k][p] == matrix[i][j])

continue;

else

sum += matrix[k][p];

}

}

printf("%d", sum);

}

}

printf("\n");

}


for (int i = 0; i < m; i++)

{

free(matrix[i]);

}

free(matrix);

return 0;

}