문제
다음 C 코드의 실행 결과를 쓰시오.
C#include <stdio.h> struct Point { int x, y; }; int calc(struct Point p, int level) { if (level <= 0) { printf("%d ", p.x + p.y); return p.x * p.y; } p.x += level; int left = calc(p, level - 2); p.y -= level; printf("%d ", p.x - p.y); int right = calc(p, level - 1); return left + right; } int main() { struct Point pt = {2, 3}; int result = calc(pt, 3); printf("=%d", result); return 0; }
정답
8 5 3 6 9 =14
8 5 3 6 9 =148 5 3 6 9=1485369=14
해설
단계별 실행 추적:
-
main에서 calc({2,3}, 3) 호출
-
calc({2,3}, 3) 실행:
- level > 0이므로 p.x = 2 + 3 = 5
- left = calc({5,3}, 1) 호출
-
calc({5,3}, 1) 실행:
- level > 0이므로 p.x = 5 + 1 = 6
- left = calc({6,3}, -1) 호출
-
calc({6,3}, -1) 실행:
- level ≤ 0이므로 printf("%d ", 6+3) → 출력: "8 "
- return 6 × 3 = 18
-
calc({5,3}, 1)로 복귀:
- p.y = 3 - 1 = 2
- printf("%d ", 6-2) → 출력: "5 "
- right = calc({6,2}, 0) 호출
-
calc({6,2}, 0) 실행:
- level ≤ 0이므로 printf("%d ", 6+2) → 출력: "3 "
- return 6 × 2 = 12
-
calc({5,3}, 1)에서 return 18 + 12 = 30
-
calc({2,3}, 3)로 복귀:
- p.y = 3 - 3 = 0
- printf("%d ", 5-0) → 출력: "6 "
- right = calc({5,0}, 2) 호출
-
calc({5,0}, 2) 실행:
- level > 0이므로 p.x = 5 + 2 = 7
- left = calc({7,0}, 0) 호출
-
calc({7,0}, 0) 실행:
- level ≤ 0이므로 printf("%d ", 7+0) → 출력: "7 " (아직 =14 아님)
- return 7 × 0 = 0
-
calc({5,0}, 2)로 복귀:
- p.y = 0 - 2 = -2
- printf("%d ", 7-(-2)) → 출력: "9 "
- right = calc({7,-2}, 1) 호출
-
calc({7,-2}, 1) 실행 후 return -16
-
calc({5,0}, 2)에서 return 0 + (-16) = -16
-
calc({2,3}, 3)에서 return 30 + (-16) = 14
-
main에서 printf("=%d", 14) → 출력: "=14"
최종 출력: 8 5 3 6 9 =14