다음 C 프로그램의 실행 결과를 쓰시오.
#include <stdio.h>
typedef struct N {
int v;
struct N *a;
struct N *b;
} N;
int c = 0;
int result;
void func(N *n) {
if (!n) return;
func(n->a);
func(n->b);
if (++c == 3)
result = n->v;
}
int main(void) {
N ne = {35, 0, 0};
N nd = {64, 0, 0};
N nc = {53, 0, 0};
N nb = {12, &ne, &nc};
N na = {21, &nb, &nd};
func(&na);
printf("%d", result);
return 0;
}모범답안
12
풀이와 판단 근거
func는 현재 노드를 처리하기 전에 왼쪽 자식 a와 오른쪽 자식 b를 차례로 재귀 호출하므로 후위 순회를 수행한다. 트리의 방문 순서는 ne의 35, nc의 53, nb의 12, nd의 64, na의 21이다.
각 노드 처리가 끝날 때 전역 c가 증가하고 c가 3이 되는 세 번째 방문 노드의 값만 result에 저장된다. 따라서 result는 12이고 printf도 12를 출력한다.
자주 틀리는 지점
- 연산자 우선순위나 재귀 반환 순서를 생략하고 눈에 보이는 값만 바로 계산함
- 값 전달·참조 전달, 오버라이딩·오버로딩 또는 배열과 포인터의 차이를 혼동함
- 출력의 공백·줄바꿈·대소문자를 무시해 12와 다른 형식으로 작성함
자동 판정 방식
한글·영문 동의어와 문항별 필수 개념을 확인하며, 정답 단어가 부정되거나 반대 개념과 함께 쓰이면 자동 정답으로 확정하지 않습니다. 부분점수는 ITPASSLAB의 학습용 예상 점수입니다.