본문 바로가기
자격증

2025년 정보처리기사 실기 1회차 C언어 문제 풀이(시각화)

by lovedeveloping 2025. 7. 15.
반응형
2025년 정보처리기사 실기 1회차에 나온 C언어 체커보드 패턴 문제를 알기 쉽게 설명 해드리겠습니다.

📋 분석할 코드

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

void set(int** arr, int* data, int rows, int cols) {
    for (int i = 0; i < rows * cols; ++i) {
        arr[((i + 1) / rows) % rows][((i + 1) % cols)] = data[i];
    }
}

int main() {
    int rows = 3, cols = 3, sum = 0;
    int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};
    int** arr;

    arr = (int**) malloc(sizeof(int*) * rows);
    for (int i = 0; i < cols; i++) {
        arr[i] = (int*) malloc(sizeof(int) * cols);
    }

    set(arr, data, rows, cols);

    for (int i = 0; i < rows * cols; i++) {
        sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1);
    }

    printf("%d", sum);
    return 0;
}

 

반응형

1️⃣ 초기 데이터 설정

int rows = 3, cols = 3;
int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};

1차원 배열 data:

5
2
7
4
1
8
3
6
9

2️⃣ 2차원 배열 메모리 할당

int** arr;
arr = (int**) malloc(sizeof(int*) * rows);
for (int i = 0; i < cols; i++) {
    arr[i] = (int*) malloc(sizeof(int) * cols);
}

✅ 3×3 2차원 배열 메모리 할당 완료

3️⃣ set 함수 - 1차원 배열을 2차원 배열로 변환

// 핵심 공식: arr[((i + 1) / rows) % rows][((i + 1) % cols)] = data[i];

변환 과정:

i=0: ((0+1)/3)%3=0, (0+1)%3=1 → arr[0][1] = data[0] = 5
i=1: ((1+1)/3)%3=0, (1+1)%3=2 → arr[0][2] = data[1] = 2
i=2: ((2+1)/3)%3=1, (2+1)%3=0 → arr[1][0] = data[2] = 7
i=3: ((3+1)/3)%3=1, (3+1)%3=1 → arr[1][1] = data[3] = 4
i=4: ((4+1)/3)%3=1, (4+1)%3=2 → arr[1][2] = data[4] = 1
i=5: ((5+1)/3)%3=2, (5+1)%3=0 → arr[2][0] = data[5] = 8
i=6: ((6+1)/3)%3=2, (6+1)%3=1 → arr[2][1] = data[6] = 3
i=7: ((7+1)/3)%3=2, (7+1)%3=2 → arr[2][2] = data[7] = 6
i=8: ((8+1)/3)%3=0, (8+1)%3=0 → arr[0][0] = data[8] = 9

최종 2차원 배열:

9
5
2
7
4
1
8
3
6

4️⃣ 체커보드 패턴 합계 계산

for (int i = 0; i < rows * cols; i++) {
    sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1);
}

체커보드 패턴 (+1, -1 교대):

+9
-5
+2
-7
+4
-1
+8
-3
+6
계산 과정:
i=0: arr[0][0] * (+1) = 9 * 1 = +9
i=1: arr[0][1] * (-1) = 5 * (-1) = -5
i=2: arr[0][2] * (+1) = 2 * 1 = +2
i=3: arr[1][0] * (-1) = 7 * (-1) = -7
i=4: arr[1][1] * (+1) = 4 * 1 = +4
i=5: arr[1][2] * (-1) = 1 * (-1) = -1
i=6: arr[2][0] * (+1) = 8 * 1 = +8
i=7: arr[2][1] * (-1) = 3 * (-1) = -3
i=8: arr[2][2] * (+1) = 6 * 1 = +6
합계: 9 + (-5) + 2 + (-7) + 4 + (-1) + 8 + (-3) + 6
= 9 - 5 + 2 - 7 + 4 - 1 + 8 - 3 + 6
= 13

5️⃣ 메모리 해제

for (int i = 0; i < rows; i++) {
    free(arr[i]);
}
free(arr);

✅ 동적 할당된 메모리 해제

🎯 최종 결과: 13

📝 코드 요약

이 코드는 다음과 같은 작업을 수행합니다:

  1. 특별한 재배열: 1차원 배열을 특별한 패턴으로 2차원 배열로 재배열
  2. 체커보드 패턴: 2차원 배열의 각 요소에 체커보드 패턴(+1, -1 교대)을 적용
  3. 합산: 모든 값을 합산하여 최종 결과 출력

핵심 공식:

  • 재배열: arr[((i + 1) / rows) % rows][((i + 1) % cols)] = data[i]
  • 체커보드: (i % 2 == 0 ? 1 : -1)
반응형