인프런 커뮤니티 질문&답변

김다훈님의 프로필 이미지
김다훈

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

섹션2 재귀함수 질문이요

해결된 질문

작성

·

100

0

55분쯤인데 아무리 일주일만에 합격목표로 압축강의찍으셨다지만.. 풀이나 많은 부분들을 생략하시고 설명하시는 것 같아서 수강 멈추고 다시보고 이해하려해보고 그래도 안되면 질문해서 이해하고 이런 부분들이 생기네요 점점. 55분 빈도 문제인데 저 재귀함수가 결과적으로 어떻게 l의 갯수를 의미하는지 아직도 해석을 못했거든요. 저런 문제는 영상에서도 본인이 어려운 문제라고 언급하셨는데도, 왜 구체적인 풀이가 없는지 답답하면서 강의 결제한 거에 회의감까지 드네요.

답변 1

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요,

나름대로 설명을 하면서도 빠르게 넘어가려고 균형을 맞추려고 노력했으나,

저도 수강생분께서 상대적으로 어렵게 느껴지실 수 있다는 것에 공감합니다.

 

해당 문제를 최선을 다해서 다시 설명드리겠습니다.

 

설명을 드리기 전에,

이 문제는 난이도 자체가 상당한 편입니다. 무슨 말씀이냐면, 시험에는 이정도 나오기가 어렵습니다.

나온다고 하더라도 킬러문제급으로 하나 나오지 않을까 수준으로 생각하시면 됩니다.

 


일단, 기본 탈출 조건을 보겠습니다.

if (*str == '\0') {
    return 0;
}

지금 str은 함수의 입력값으로 char *str로 선언되어 있기 때문에 str 자체는 우리가 알 수 없는 메모리 주소로 되어있습니다.

그 메모리 주소는 hello world의 가장 앞을 가리키고 있고, 그 값(*)을 꺼내오면 h 문자 하나만 가져옵니다.

어쨌든, 메모리 주소를 왔다갔다 하면서 알파벳들을 휘젓고 다닐건데 그 휘젓고 다닐 때 우연치 않게 해당 값이 '\0' 널문자 (문자열 가장 끝에 있지만 실제로는 보이지 않는)가 되면 0을 리턴하겠다는 것입니다.

 

리턴의 0은 아시다시피 2가지 방법으로 쓰일 수 있습니다.

조건을 판단할 때는 C언어는 0을 거짓으로 판단하고, 그 외에는 그냥 우리가 다 알고 있는 숫자 0으로 해석할 겁니다.


NULL은 문자열 가장 마지막에 0을 돌려준다는 것은 알겠고, 그 다음의 else 부분을 봅시다.

함수명은 계속 써야하니 편의상 CF라고 줄이겠습니다. 양해 부탁드립니다.

 

처음에 들어왔더니

(*str == ch) + CF(str+1, ch) 라고 되어있습니다.

앞의 괄호는 조건문입니다. ==으로 앞과 뒤를 비교하겠다는 이야기입니다.

조건문은 참(1)이거나 거짓(0)을 반환합니다.

지금 ch는 뭔가요? 두번째 입력값으로 온 문자 'l' (엘) 입니다. 우리는 문자열 전체에서 l이 몇 개인지를 찾는 것이었죠?

 

str은 h 부분의 메모리를 가리키고 있습니다. 그것의 값(*)을 가져오라고 했더니, h였습니다. 해당 괄호는 h == l을 물어봅니다. 그래서 0을 리턴합니다.

 

최종적으로 0 + CF(str+1, l)이 됩니다. 그럼 이제 str+1을 값을 넣은 CF를 다시 호출합니다.

왜냐하면 아직 전체 리턴이 종료되지 않았기 때문입니다.

CF에 str+1, l을 다시 넣읍시다.


현재 상황: 아직 함수 진행 중. 앞에 0 + CF(str+1, l)

 

str+1은 뭔가요?

str은 메모리 주소라고 말씀드렸습니다. h라는 문자 값이 아니고 h의 집주소를 가리켰습니다.

거기에서 한 칸 옆으로 가라는 뜻입니다. h의 옆은 e가 살고 있는 메모리 주소입니다.

그곳의 값을 다시 꺼냅니다 (*str) 그리고 그것을 l과 비교합니다.

(*str == ch) ------------------> e == l 을 묻는 것입니다. 여기도 틀립니다. 그래서 0을 리턴합니다.

아직 끝나지 않았습니다. 0 + 0 + CF(str+1+1, l)로 다시 함수를 호출합시다.

 

현재 상황: 아직 함수 진행 중. 앞에 0 + 0 + CF(str+1+1, l)

요정도 오면 패턴이 보이실까요?

계속 옆집을 물어보고 있습니다. 메모리를 +1씩 옮겨가면서요.

h했고 e했고 이제 드디어 l이 오겠네요.

입력값으로 e 오른쪽 옆에 위치한 집의 위치를 전달했습니다. (str+1+1)

넘어가서 (*str == ch)부분이 이제는 1이 됩니다.

l == l 을 비교했기 때문입니다. (엘과 엘이 같느냐? 네 같습니다. 그래서 참인 1 반환)

이제는

0 + 0 + 1 + CF(str+1+1+1, l)인 상황이 되었습니다.


 

메모리 주소 값을 옆으로 옮겨가면서 계속 0 아니면 1을 누적했을 것입니다.

l을 만났을 때마다 1개씩 늘렸을 거에요.

가장 마지막인 d까지 비교해서 0을 리턴했을 겁니다.

 

아직도 함수 안 끝났습니다.

그래서 정리하자면

hello world는

0 + 0 + 1 + 1 + 0 + 0 (빈칸) + 0 + 0 + 0 + 1 + 0 (d부분) + CF(str+앞의 갯수만큼의 1, l)이 진행 중입니다.

 

드디어 마지막입니다.

이제는 맨 처음의 탈출 조건이었던 '\0'을 만납니다.

그래서 0을 리턴합니다.


 

지금까지의 먼 여정을 끝내고 모두 합한 다음에 최초로 호출한 함수로 쫘악 더해서 전달합니다.

 

그래서 문자열의 l의 갯수만큼 1이 더해져서 3이 됩니다.

 

이해에 도움이 되셨을까요?

 

김다훈님의 프로필 이미지
김다훈

작성한 질문수

질문하기