강의

멘토링

커뮤니티

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

김가현님의 프로필 이미지
김가현

작성한 질문수

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

함수와 재귀함수 (v2)

56분 charFreq(str + 1, ch); 질문

해결된 질문

작성

·

23

0

다른 분이 질문한 내용을 읽어보고 고민하고 생각해봤는데도 이해가 안되서 질문 합니다.

str == ch 는 0 이되는건 알겠는데 그 옆
str+1로 다음 글자 인것도 알겠습니다 근데 그옆에 ch는 무슨뜻이죠?? ch는 그냥 무시하는 건가요?
return(*str == ch)여기에서 0이 되는건 이해됩니다. 그런데 charFreq(str + 1, ch)에서 ch는 그냥 무시되어버리는 도저히 이해가 안됩니다 ㅠㅠ 도와주세요 charFreq(str + 1,ch) 여기 값에서는 무슨 짓을 해도 계속 0이 나오는건가요?

답변 2

0

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

안녕하세요, 가현님.

인프런 질문 창에서 별표(*)를 앞뒤로 입력하면 글씨가 이탤릭체(옆으로 기울어지는 꼴)로 작성됩니다.

작성하실 때는 꼭 코드형태 * 로 작성해주셔야 합니다. 제가 질문을 아예 못 알아들을 수 있어서 그렇습니다.

 


저기서 ch는 최초에 입력으로 들어오는 문자입니다.

지금은 main 함수의 두번째 줄을 보시면 알 수 있습니다. L의 소문자인 l입니다.

char targetChar = 'l';

 

charFreq는 하나씩 옆으로 가면서 계속 l하고 같은 문자인지를 비교하는 것입니다.

그러니까 모든 ch는 문자 'l'이라고 보시면 됩니다.

 

charFreq는 지금 가리키고 있는 str를 하나 증가시켰으니,

비교하고 있는 문자열 (hello world)에서 하나 오른쪽으로 간 문자를

파라미터로 넣어서 다시 charFreq를 수행하라는 뜻입니다.

 

이해가 되셨을까요?

 

이해가 안된 경우에는 새로운 질문이 아닌 이 답변에 대댓글로 질문 부탁드립니다!

김가현님의 프로필 이미지
김가현
질문자

선생님... 설명을 해주셔도 이해가 안됩니다..

심지어 지뢰찾기 같은 개념도 이해를 했는데 그리고 푸는 방법까지 다 익혔는데, ch는 어떻게 해석이 되는건지 너무 어렵습니다... (*str == l) + charFreq(str +1, ch); 다시 또 듣고 있는데도 str+1,ch)가 모르겠어요.. charFreq(str + 1,ch)를 재귀함수를 통해서 계속 반복해야하는 식이라서 ch에는 l이 고정이 되는건가요? 결국 l이라는 문자를 찾아야 하니까요

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

이거 제가 오후에 순서대로 다시 풀어서 설명 올려볼게요.

김가현님의 프로필 이미지
김가현
질문자

선생님 답변 다는거 깜빡하신거 아니시져?? ㅠㅠ

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

먼저 단계별로 살펴보겠습니다.

charFreq(myString, targetChar)

문자열 "hello world"에서 문자 'l'이 몇 번 나오는지 세기 위해

charFreq 함수를 호출합니다.

전달되는 값:

- str --> "hello world"의 첫 글자 주소

- ch --> 'l'

 


재귀 함수의 동작 원리를 보시면 문자열 끝인지를 확인하고, 그렇지 않은 경우에는

(*str == ch) + charFreq(str+1, ch)를 리턴합니다.

아시다시피 현재 글자가 찾는 문자와 같으면 1이고, 그렇지 않으면 0입니다. (참 거짓은 C언어에서 1 혹은 0 리턴)

 

아예 전체 흐름을 다 적도록 하겠습니다.

"hello world"에서 'l' 찾기

charFreq("hello world", 'l') --> 'h' == 'l'? 아니오(0) --> 0 + charFreq("ello world", 'l')

charFreq("ello world", 'l') --> 'e' == 'l'? 아니오(0) --> 0 + charFreq("llo world", 'l')

charFreq("llo world", 'l') --> 'l' == 'l'? 예!(1) --> 1 + charFreq("lo world", 'l')

charFreq("lo world", 'l') --> 'l' == 'l'? 예!(1) --> 1 + charFreq("o world", 'l')

charFreq("o world", 'l') --> 'o' == 'l'? 아니오(0) --> 0 + charFreq(" world", 'l')

charFreq(" world", 'l') --> ' ' == 'l'? 아니오(0) --> 0 + charFreq("world", 'l')

charFreq("world", 'l') --> 'w' == 'l'? 아니오(0) --> 0 + charFreq("orld", 'l')

charFreq("orld", 'l') --> 'o' == 'l'? 아니오(0) --> 0 + charFreq("rld", 'l')

charFreq("rld", 'l') --> 'r' == 'l'? 아니오(0) --> 0 + charFreq("ld", 'l')

charFreq("ld", 'l') --> 'l' == 'l'? 예!(1) --> 1 + charFreq("d", 'l')

charFreq("d", 'l') --> 'd' == 'l'? 아니오(0) --> 0 + charFreq("", 'l')

charFreq("", 'l') --> '\0' 발견! --> return 0 <-- 종료!

 

여기서 잘 보셔야하는게 앞에서 호출한 함수의 리턴값이,

이 전에서 기다리고 있는 숫자와 더해지고 있습니다.

예를 들어서 0 + charFreq("ello world", 'l') <-- 이 상태는

앞에서 0이 대기하고 있고, 뒤의 charFreq("ello world", 'l') 리턴값을 기다리고 있는 상태입니다. 이건 계속 전개되어서 계산되는 중인 것이고요.


이 상태에서 값이 돌아와야 합니다.

charFreq("") --> 0

charFreq("d") --> 0 + 0 = 0

charFreq("ld") --> 1 + 0 = 1

charFreq("rld") --> 0 + 1 = 1

charFreq("orld") --> 0 + 1 = 1

charFreq("world") --> 0 + 1 = 1

charFreq(" world") --> 0 + 1 = 1

charFreq("o world") --> 0 + 1 = 1

charFreq("lo world") --> 1 + 1 = 2

charFreq("llo world") --> 1 + 2 = 3

charFreq("ello world") --> 0 + 3 = 3

charFreq("hello world") --> 0 + 3 = 3

최종 결과: 3

 


재귀함수는 아래로 계속 가면서 깊게 나아가고, 뒤에서 리턴되어서 돌아오기 때문에 한 번에 더해서 계산해야합니다.

 

[종료 조건] *str == '\0' --> 문자열 끝에 도달하면 멈춤

[재귀 호출] charFreq(str + 1, ch) --> 다음 글자로 이동

[값 누적] (*str == ch) + --> 일치하면 1, 아니면 0을 더함

 

이해가 되셨을까요?

김가현님의 프로필 이미지
김가현
질문자

네 상세하게 다 풀어서 설명을 해주시니 이제 이해가 되었습니다.

감사합니다.

재귀호출의 의미가 있어서 str+1,ch 즉 str이 한칸씩 넘어가면서 ch=l의 값을 찾으라는 내용을 확실히 알게되었습니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김가현님.

질문하신 내용에서 함수 호출과 관련된 질문을 하신 것으로 보입니다. 함수를 통해 문자열 내에서 특정 문자가 얼마나 자주 나타나는지를 찾는 메커니즘에 대해 간단히 설명드리겠습니다.

문제 해결 요점

  1. 함수 호출 charFreq(str + 1, ch):

    • 여기서 charFreq는 재귀 함수로, 문자열 str을 한 문자씩 확인하면서 ch와 일치하는 문자의 개수를 찾는 역할을 합니다.
    • str + 1은 문자열 포인터를 한 글자 오른쪽으로 이동시키면서 호출하여 문자열 전체를 순회할 수 있게 합니다.
    • ch는 찾고자 하는 특정 문자입니다. charFreq(str + 1, ch)에서 ch는 각 재귀호출에서 비교할 기준 문자로 계속 사용되며, 무시되지 않습니다.
  2. 반환값 및 연산:

    • *_str == ch는 현재 str의 위치에서 ch와의 일치 여부를 검사합니다. 일치하면 해당 위치에서 1을 더하게 됩니다.
    • 함수가 종료되지 않는 한, 모든 문자 위치에서의 일치 여부를 판별하여 최종적으로 해당 문자열 내 ch의 출현 빈도가 반환됩니다.

보다 나은 이해를 위한 참고 자료

위 설명이 김가현님의 이해에 도움이 되길 바랍니다. 여전히 혼란스러운 점이나 추가적인 궁금증이 있으시면 언제든지 질문해 주세요. 더 깊게 살펴볼 수 있도록 안내드리겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김가현님의 프로필 이미지
김가현

작성한 질문수

질문하기