Programming Languages/C

[P4C] C언어 코딩 도장 : 문제 풀이 4

h4won 2021. 3. 5. 16:47

34.10 심사 문제 : 포인터와 주소 연산자 사용하기

 

문제 : 표준 입력으로 정수가 입력됩니다. 다음 소스 코드를 완성하여 입력된 정수가 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int* numPtr1;
    int** numPtr2;
    int num1;

    scanf("%d", &num1);

    numPtr1 = &num1;
    numPtr2 = &numPtr1;

    printf("%d\n", **numPtr2);

    return 0;
}

 

 

 

34.10 심사 문제 : 포인터와 주소 연산자 사용하기

 

문제 : 표준 입력으로 두 정수가 입력됩니다(입력 값의 범위는 0~1073741824). 다음 소스 코드를 완성하여 입력된 두 정수의 합이 출력되게 만드세요.

정답 :

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

int main()
{
    int num1;
    int num2;

    int* numPtr1 = malloc(sizeof(int));
    int* numPtr2 = malloc(sizeof(int));

    scanf("%d %d", &num1, &num2);

    *numPtr1 = num1;
    *numPtr2 = num2;

    printf("%d\n", *numPtr1 + *numPtr2);

    free(numPtr1);
    free(numPtr2);

    return 0;
}

 

 

 

36.13 심사문제 : 가장 작은 수 출력하기

 

문제 : 표준 입력으로 정수 다섯 개가 입력됩니다(입력 값의 범위는 -2147483648~2147483647). 다음 소스 코드를 완성하여 입력된 정수 중에서 가장 작은 수가 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int numArr[5];
    int smallestNumber;

    scanf("%d %d %d %d %d", &numArr[0], &numArr[1], &numArr[2], &numArr[3], &numArr[4]);

    smallestNumber = numArr[0];

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)
    {
        if (numArr[i] < smallestNumber)
            smallestNumber = numArr[i];
    }
    
    printf("%d\n", smallestNumber);

    return 0;
}

먼저 변수 smallestNumber에 배열의 첫 번째 요소를 저장한다. 그리고 배열의 요소 개수만큼 반복하면서 smallestNumber와 배열의 각 요소를 비교하면 된다.

 

 

 

37.9 심사 문제 : 전치행렬 구하기

 

문제 : 표준 입력으로 5x5 정사각행렬이 입력됩니다. 다음 소스 코드를 완성하여 입력된 행렬의 전치행렬이 출력되게 만드세요. 전치행렬은 왼쪽 위부터 오른쪽 아래까지의 대각선(주대각선)을 기준으로 값을 뒤집은 행렬을 말합니다.

 

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int matrix[5][5];

    scanf("%d %d %d %d %d",
        &matrix[0][0], &matrix[0][1], &matrix[0][2], &matrix[0][3], &matrix[0][4]);
    scanf("%d %d %d %d %d",
        &matrix[1][0], &matrix[1][1], &matrix[1][2], &matrix[1][3], &matrix[1][4]);
    scanf("%d %d %d %d %d",
        &matrix[2][0], &matrix[2][1], &matrix[2][2], &matrix[2][3], &matrix[2][4]);
    scanf("%d %d %d %d %d",
        &matrix[3][0], &matrix[3][1], &matrix[3][2], &matrix[3][3], &matrix[3][4]);
    scanf("%d %d %d %d %d",
        &matrix[4][0], &matrix[4][1], &matrix[4][2], &matrix[4][3], &matrix[4][4]);

    int col = sizeof(matrix) / sizeof(matrix[0]);
    int row = sizeof(matrix[0]) / sizeof(int);

    for (int i = 0; i < col; i++)
    {
        for (int j = 0; j < row; j++)
            printf("%d ", matrix[j][i]);

        printf("\n");
    }

    return 0;
}

먼저 전치행렬을 잘 살펴보면 행과 열이 서로 바뀌어 있다. 따라서 2차원 배열을 출력할 때 matrix[n][m]과 같이 세로 부분에는 열(n)을 넣고, 가로 부분에는 행(m)을 넣어주면 된다.

 

 

 

 

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

 

문제 : 표준 입력으로 정사각행렬의 크기가 입력됩니다(입력 값의 범위는 2~10). 입력된 크기만큼의 단위행렬을 출력하는 프로그램을 만드세요.

단위행렬은 왼쪽 위부터 오른쪽 아래까지의 대각선(주대각선)이 1이며 나머지는 모두 0인 행렬입니다.

 

정답 :

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

int main()
{
    int size;

    scanf("%d", &size);

    int **m = malloc(sizeof(int*) * size); // 세로 공간 메모리 할당

    for (int i=0; i < size; i++) 
    {
        m[i] = malloc(sizeof(int) * size); // 가로 공간 메모리 할당
        memset(m[i], 0, sizeof(int) * size); // 배열 모두 0으로 초기화
    }

    for (int i=0; i < size; i++)
    {
        m[i][i] = 1; // 단위 행렬 만들기
    }

    for (int i=0; i < size; i++)
    {
        for (int j=0; j < size; j++)
        {
            printf("%d ", m[i][j]); // 배열의 모든 요소 출력
        }

        printf("\n");
    }

    for (int i=0; i < size; i++)
    {
        free(m[i]); // 가로 공간 메모리 해제
    }

    free(m); // 세로 공간 메모리 해제

    return 0;
}

 

 

 

 

38.8 심사 문제 : 지뢰 찾기

 

문제 : 표준 입력으로 행렬의 크기 m, n과 문자(char) 행렬이 입력됩니다(m n의 범위는 3~10). 입력된 m, n은 공백으로 구분되며 행렬 안에서 *은 지뢰이고 .은 지뢰가 아닙니다. 지뢰가 아닌 요소에는 인접한 지뢰의 개수를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다).

 

정답 :

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

int main()
{
    int m, n;
    int i, j;

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

    char **matrix = malloc(sizeof(char *) * m); // char* 형 세로 공간 메모리 할당

    for (i = 0; i < m; i++)
    {
        matrix[i] = malloc(sizeof(char) * (n + 1)); // char 형 가로 공간 메모리 할당
        memset(matrix[i], 0, sizeof(char) * (n + 1)); // 배열 0으로 초기화
    }

    for (i = 0; i < m; i++)
    {
        scanf("%s", matrix[i]); // 한 줄씩 문자열 입력받기
    }

    for (i = 0; i < m; i++) 
    {
        for (j = 0; j < n; j++) // m,n 만큼 반복하며 모든 요소를 검사
        {
            if (matrix[i][j] == '*') // 요소가 *이면 그대로 출력하고 continue
            {
                printf("%c", matrix[i][j]);
                continue;
            }

            else // 요소가 *이 아니면 요소 주변 8개를 탐색
            {
                matrix[i][j] = 0;

                for (int x = i - 1; x <= i + 1; x++)
                {
                    for (int y = j - 1; y <= j + 1; y++)
                    {
                        if (x<0 || x>=n || y<0 || y>=n)
                            continue;

                        else if (matrix[x][y] == '*')
                            matrix[i][j] += 1; // 요소 주변 8개 중 지뢰가 발견될 때마다 요소를 1씩 증가시킴
                    }

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

    for (int i = 0; i < m; i++) // 가로 공간 메모리 해제
        free(matrix[i]);

    free(matrix); // 세로 공간 메모리 해제

    return 0;

}