Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 38. 연습문제 및 심사문제 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 38. 연습문제 및 심사문제

개발새발 문타쿠 2023. 9. 23. 22:53

38.6 연습문제: 포인터에 할당된 메모리를 3차원 배열처럼 사용하기

#include <stdio.h>
#include <stdlib.h> 

int main(void)
{
    /* depth = 2, row = 3, col = 5 */

    long long*** m = malloc(sizeof(long long**) * 2);

    for (int depth = 0; depth < 2; depth++)
    {
        m[depth] = malloc(sizeof(long long*) * 3);

        for (int row = 0 ;row < 3; row++)
        {
            m[depth][row] = malloc(sizeof(long long) * 5);
        }
    }

    m[1][2][4] = 100;

    printf("%lld\n", m[1][2][4]);

    for (int depth = 0; depth < 2; depth++)
    {
        for (int row = 0; row < 3; row++)
        {
            free(m[depth][row]);
        }
        
        free(m[depth]);
    }

    free(m);

    return 0;
}

38.7 심사문제: 단위행렬 만들기

#include <stdio.h>
#include <stdlib.h> 

int main(void)
{
    int size;

    scanf_s("%d", &size);
    printf("\n");

    if (size < 2 || size>10)
    {
        printf("크기는 2~10 사이로 입력해주세요.\n");
        
        return 1;
    }

    // 행
    int** square = malloc(sizeof(int *) * size);

    for (int i = 0; i < size; i++)
    {
        // 열
        square[i] = malloc(sizeof(int) * size);
    }

    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if (i == j)
            {
                square[i][j] = 1;
            }
            else
            {
                square[i][j] = 0;
            }
            
            printf("%d ", square[i][j]);
        }

        printf("\n");
    }

    for (int i = 0; i < size; i++)
    {
        // 열 영역 메모리 해제
        free(square[i]);
    }

    // 행 영역 메모리 해제
    free(square);

    return 0;
}


38.8 심사문제: 지뢰찾기

1차 작성 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 

int main(void)
{
    int row, col;

    printf("행의 크기>> ");
    scanf("%d", &row);

    if (row < 3 || row > 10)
    {
        printf("행의 범위는 3 ~ 10입니다.");
        return 1;
    }

    printf("열의 크기>> ");
    scanf("%d", &col);
    
    if (col < 3 || col>10)
    {
        printf("열의 범위는 3 ~ 10입니다.");
        return 1;
    }
    printf("\n");

    // 2차원 배열 동적 할당
    char** minesweeper = malloc(sizeof(char*) * row);
    for (int i = 0; i < row; i++)
    {
        minesweeper[i] = malloc(sizeof(char) * col);
    }

    // 2차원 배열에 문자 값 입력
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            // 입력 버퍼에 남아 있는 공백 문자나 개행 문자를 무시하기 위해서 서식 지정자 앞에 공백을 추가
            scanf(" %c", &minesweeper[i][j]);
        }
    }
    printf("\n");

    // 입력한 문자 값 2차원 배열 형태로 출력(없어도 되는 부분)
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%c ", minesweeper[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    // 지뢰 찾기
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (minesweeper[i][j] == '*')
            {
                printf("%c ", minesweeper[i][j]);
            }
            else
            {
                int count = 0;

                // 상
                if ((i - 1 >= 0) && (minesweeper[i - 1][j] == '*'))
                    count++;
                // 하
                if ((i + 1 < row) && (minesweeper[i + 1][j] == '*'))
                    count++;
                // 좌
                if ((j - 1 >= 0) && (minesweeper[i][j - 1] == '*'))
                    count++;
                // 우
                if ((j + 1 < col) && (minesweeper[i][j + 1] == '*'))
                    count++;
                // 대각선 상좌
                if ((i - 1 >= 0) && (j - 1 >= 0) && (minesweeper[i - 1][j - 1] == '*'))
                    count++;
                // 대각선 상우
                if ((i - 1 >= 0) && (j + 1 < col) && (minesweeper[i - 1][j + 1] == '*'))
                    count++;
                // 대각선 하좌
                if ((i + 1 < row) && (j - 1 >= 0) && (minesweeper[i + 1][j - 1] == '*'))
                    count++;
                // 대각선 하우
                if ((i + 1 < row) && (j + 1 < col) && (minesweeper[i + 1][j + 1] == '*'))
                    count++;
                           
                minesweeper[i][j] = count;

                printf("%d ", minesweeper[i][j]);
            }
        }
        printf("\n");
    }

    // 2차원 배열 동적 할당 해제
    for (int i = 0; i < row; i++)
    {
        free(minesweeper[i]);
    }
    free(minesweeper);

    return 0;
}

지뢰찾기 부분의 중복 코드를 간략화 한 2차 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 

int main(void)
{
    int row, col;

    printf("행의 크기>> ");
    scanf("%d", &row);

    if (row < 3 || row > 10)
    {
        printf("행의 범위는 3 ~ 10입니다.");
        return 1;
    }

    printf("열의 크기>> ");
    scanf("%d", &col);
    
    if (col < 3 || col>10)
    {
        printf("열의 범위는 3 ~ 10입니다.");
        return 1;
    }
    printf("\n");

    // 2차원 배열 동적 할당
    // 행
    char** minesweeper = malloc(sizeof(char*) * row);

    for (int i = 0; i < row; i++)
    {
        // 열
        minesweeper[i] = malloc(sizeof(char) * col);
    }

    // 2차원 배열에 문자 값 입력
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            // 입력 버퍼에 남아 있는 공백 문자나 개행 문자를 무시하기 위해서 서식 지정자 앞에 공백을 추가
            scanf(" %c", &minesweeper[i][j]);
        }
    }
    printf("\n");

    // 입력한 문자 값 2차원 배열 형태로 출력(없어도 되는 부분)
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%c ", minesweeper[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    // 지뢰 찾기
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (minesweeper[i][j] == '*')
            {
                printf("%c ", minesweeper[i][j]);
            }
            else
            {
                int count = 0;

                // 상 하 좌 우 대각선 방향 검사
                for (int upDown = -1; upDown <= 1; upDown++)
                {
                    for (int leftRight = -1; leftRight <= 1; leftRight++)
                    {
                        if (upDown == 0 && leftRight == 0)
                            continue;

                        int checkRow = i + upDown;
                        int checkCol = j + leftRight;

                        if (checkRow >= 0 && checkRow < row && checkCol >= 0 && checkCol < col && \
                            minesweeper[checkRow][checkCol] == '*')
                            count++;
                    }
                }
                         
                minesweeper[i][j] = count;

                printf("%d ", minesweeper[i][j]);
            }
        }
        printf("\n");
    }

    // 2차원 배열 동적 할당 해제
    for (int i = 0; i < row; i++)
    {
        free(minesweeper[i]);
    }
    free(minesweeper);

    return 0;
}