문제
다음 C 코드의 출력 결과로 가장 적절한 것은?
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 = (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); } for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr); printf("%d", sum); }
① 13 ② 12 ③ 9 ④ 15
정답
1번
해설
정답: 1. set 함수 수행 후 배열은 [9,5,2], [7,4,1], [8,3,6] 형태가 된다. 이후 짝수 인덱스는 더하고 홀수 인덱스는 빼면 9-5+2-7+4-1+8-3+6 = 13이다.
오답 풀이
- 1번: 배열 배치와 부호 계산을 올바르게 추적한 결과이다.
- 2번: 일부 원소의 부호를 잘못 적용한 값이다.
- 3번: 배열 배치 순서를 단순 행 우선으로 착각한 값이다.
- 4번: 특정 원소를 누락하거나 중복 계산한 값이다.
보충 개념
포인터 배열로 만든 2차원 배열은 인덱스 계산을 정확히 추적해야 한다. %와 / 연산이 행과 열 계산에 어떻게 사용되는지 확인해야 한다.