문제 10정답을 고른 뒤 해설을 펼쳐보세요.

다음 C 프로그램의 출력 결과는?

#include <stdio.h>

void func(int *p, int *q) {

if (p > q) return;

printf("%d ", *p + *q);

func(p + 1, q - 1);

}

int main(void) {

int a[] = { 3, 1, 4, 1, 5 };

func(a, a + 4);

return 0;

}

  1. ①
    6 2 8
    정답
  2. ②
    8 2 6
    정답
  3. ③
    8 2 8
    정답
  4. ④
    8 8 2
    정답
정답·해설 펼치기정답·해설 접기
정답 ③C 포인터와 재귀

정답: 공식 최종정답 기준 · 검수 방식

정답 근거

정답은 ③입니다. func(a, a + 4)에서 p는 a[0], q는 a[4]를 가리킵니다. 첫 호출은 3 + 5 = 8을 출력하고 func(a + 1, a + 3)을 부릅니다. 두 번째 호출은 a[1] + a[3] = 1 + 1 = 2를 출력하고 func(a + 2, a + 2)를 부릅니다. 세 번째 호출은 p와 q가 같은 위치이므로 p > q가 아니어서 a[2] + a[2] = 4 + 4 = 8을 출력합니다. 그다음 p = a + 3, q = a + 1이 되어 p > q이므로 종료합니다. 출력은 8 2 8입니다.

보기별 검토

✗① 첫 값을 3 + 3 등으로 잘못 계산한 결과입니다.

✗② 마지막 호출(가운데 원소 4 + 4)을 6으로 잘못 계산한 결과입니다.

✓③ 8 2 8이므로 옳습니다.

✗④ 호출 순서를 잘못 추적한 결과입니다.

풀이 요령 · 관련 개념

풀이 요령: 양 끝에서 안쪽으로 좁혀 오는 재귀는 「p와 q가 만나는 가운데 원소도 한 번 처리되는지」를 종료 조건(p > q)으로 반드시 확인합니다.