문제
다음 C 코드의 실행 결과를 쓰시오.
C#include <stdio.h> typedef struct { int val; int cnt; } Node; int calc(Node n) { if (n.cnt <= 0) return n.val; n.val += n.cnt; n.cnt--; int left = calc(n); n.val -= 2; int right = calc(n); printf("%d ", left + right); return left - right; } int main() { Node n = {5, 3}; int result = calc(n); printf("%d", result); return 0; }
정답
20 16 4 0
20 16 4 020164 02016 4 0
해설
구조체가 값으로 전달되므로 각 calc 호출은 독립적인 n을 갖습니다.
실행 과정을 단계별로 추적하면:
-
calc({5,3}) 호출
- val = 5+3 = 8, cnt = 2
- left = calc({8,2})
- val = 8-2 = 6
- right = calc({6,2})
-
calc({8,2}) 호출
- val = 8+2 = 10, cnt = 1
- left = calc({10,1})
- val = 10-2 = 8
- right = calc({8,1})
-
calc({10,1}) 호출
- val = 10+1 = 11, cnt = 0
- left = calc({11,0}) → 11 반환 (기저조건)
- val = 11-2 = 9
- right = calc({9,0}) → 9 반환 (기저조건)
- printf("%d ", 11+9) → "20 " 출력
- return 11-9 = 2
-
calc({8,1}) 호출
- val = 8+1 = 9, cnt = 0
- left = calc({9,0}) → 9 반환
- val = 9-2 = 7
- right = calc({7,0}) → 7 반환
- printf("%d ", 9+7) → "16 " 출력
- return 9-7 = 2
-
calc({8,2})에서 printf(2+2) → "4 " 출력, return 2-2 = 0
-
calc({6,2})도 동일하게 처리되어 0 반환
-
calc({5,3})에서 return 0-0 = 0
-
main에서 printf("%d", 0) → "0" 출력
최종 출력: "20 16 4 0"