ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 3023번 : 마술사 이민혁 (C 언어)
    c c++ 언어 공부 2023. 10. 14. 18:59

    https://www.acmicpc.net/problem/3023

     

    3023번: 마술사 이민혁

    첫째 줄에 왼쪽 위 부분의 행의 개수 R과 열의 개수 C가 주어진다. (1 ≤ R, C ≤ 50) 다음 R개 줄에는 C개의 문자 '.' 또는 '#'가 주어진다. 마지막 줄에는 에러의 위치 A와 B가 주어진다. (1 ≤ A ≤ 2R, 1

    www.acmicpc.net

    Code:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <stdio.h>
     
    int main() {
        int r, c;
        int a, b;
        scanf("%d %d"&r, &c);
        char arr[101][101= { 0, };
        char result[101][101= { 0, };
        int x = 1, y = 1;
        for (int i = 0; i < r; i++)
        {
            scanf("%s", arr[i]);
        }
        scanf("%d %d"&a, &b);
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                result[i][j] = arr[i][j];
            }
         }
        for (int i = r; i < 2*r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                result[i][j] = arr[i-y][j];
            }
            y+=2;
        }
        for (int i = 0; i < r; i++)
        {
            for (int j = c; j < 2*c; j++)
            {
                result[i][j] = arr[i][j-x];
                x += 2;
            }
            x = 1;
        }
        x = 1; y = 1;
        for (int i = r; i < 2*r; i++)
        {
            for (int j = c; j < 2*c; j++)
            {
                result[i][j] = arr[i-y][j-x];
                x += 2;
            }
            x = 1;
            y += 2;
        }
        if (result[a - 1][b - 1== '#')
        {
            result[a - 1][b - 1= '.';
        }
        else
        {
            result[a - 1][b - 1= '#';
        }
        for (int i = 0; i < 2 * r; i++)
        {
            printf("%s", result[i]);
            printf("\n");
        }
    }
    cs

    문제 설명: 마술사 이민혁의 카드 뒷면 디자인

    이민혁이 사용하는 카드의 뒷면은 특별한 방식으로 디자인됩니다. 카드 뒷면의 디자인은 왼쪽 위 1/4 부분을 디자인하고, 이를 대칭시켜 오른쪽 위를 만든 후 다시 대칭시켜 아래 부분을 완성합니다. 이때, 디자인 중 의도적인 에러를 생성하여 카드 뒷면을 완성합니다. 에러는 원래 '#'이어야 하는 칸을 '.'로 바꾸거나 '.'이어야 하는 칸을 '#'로 바꿔 생성됩니다.

    주어진 입력에는 왼쪽 위 부분의 행과 열의 개수인 R과 C가 주어지고, 그에 따른 디자인과 에러의 위치 A와 B가 주어집니다. 우리의 목표는 이 정보를 활용하여 전체 카드 뒷면의 디자인을 완성하고 출력하는 것입니다.

    코드 설명: C 프로그램

    변수 r과 c는 왼쪽 위 부분의 행과 열의 개수를 나타냅니다. 변수 a와 b는 에러의 위치를 나타냅니다.

    arr은 왼쪽 위 디자인과 에러를 저장하는 배열이며, result는 최종적인 카드 뒷면 디자인을 저장하는 배열입니다.

    변수 x와 y는 배열에서 인덱스를 이동시키기 위한 변수입니다.

    첫 번째 단계에서는 왼쪽 위 디자인을 입력받습니다.

    두 번째 단계에서는 에러의 위치를 입력받습니다.

    세 번째 단계부터는 주어진 디자인과 에러의 위치를 이용하여 전체 카드 뒷면의 디자인을 완성합니다. 먼저 왼쪽 위 1/4 디자인을 result에 복사하고, 이를 대칭시켜 오른쪽 위 부분을 완성합니다. 그 다음, 왼쪽 위 디자인에서 열의 방향으로 대칭시켜 아래 부분을 완성합니다. 마지막으로 오른쪽 아래 부분을 대칭시켜 전체 카드 뒷면의 디자인을 완성합니다.

    마지막 단계에서는 에러의 위치에 따라 '#'과 '.'를 교체하여 최종 디자인을 완성합니다.

Designed by Tistory.