해결된 질문
작성
·
109
답변 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을 다시 넣읍시다.
str+1은 뭔가요?
str은 메모리 주소라고 말씀드렸습니다. h라는 문자 값이 아니고 h의 집주소를 가리켰습니다.
거기에서 한 칸 옆으로 가라는 뜻입니다. h의 옆은 e가 살고 있는 메모리 주소입니다.
그곳의 값을 다시 꺼냅니다 (*str) 그리고 그것을 l과 비교합니다.
(*str == ch) ------------------> e == l 을 묻는 것입니다. 여기도 틀립니다. 그래서 0을 리턴합니다.
아직 끝나지 않았습니다. 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이 됩니다.
이해에 도움이 되셨을까요?