• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

7.8 단어세기 예제

21.03.26 19:29 작성 조회수 79

0

7.8 단어세기 예제에서

if (!isspace(c))

n_chars++;

이렇게  n_chars++; 을 해주면 단어 수가 세어지는 이유가 무엇인지 잘 모르겠습니다... 원리를 잘 모르겠어요 ㅠㅠ

그리고 line_flag = false; 와 line_flage = true; 의 의미를 잘 모르겠는데 

구체적인 설명과 정의 및 활용 방법을 설명해주시면 감사하겠습니다! 

답변 1

답변을 작성해보세요.

0

안소님의 프로필

안소

2021.03.29

안녕하세요 :)

n_chars 는 단어수가 아니라 전체 문자 수입니다. 단어 수의 원리에 대해 질문 주신 것인지 n_chars 의 원리에 대해 질문 주신 것인지 모르겠어서 일단 두 경우 다 설명 드리겠습니다. 그리고 isspace(c) 는 파라미터로 넘긴 c 문자가 공백 혹은 줄바꿈 문자같은 whitespace 라면 true 를 리턴한다는 사실을 먼저 전제로 알고 계셔야 합니다. 강의에서 나온 전체 코드를 함께 보시면서 밑에 글을 읽어주세요.

예를 들어 "Hello  World" 이건 단어가 2 개죠. 단어가 2개라고 판단하는 이유는 중간에 '공백'으로 구분이 되어 있기 때문입니다. 

마찬가지로

"Hello"

"World"

이렇게 두 줄이 있다면 이것도 단어가 2 개라고 판단할 수 있죠. 중간에 '줄바꿈'으로 구분이 되어 있으니까요. 

그러니 공백이나 줄바꿈 문자가 등장할 때마다 단어수를 카운팅해주면 되겠다고 생각할 수 있습니다.

근데 주의사항은.. 예를 들어 "Hello             World" 이런 문장이 있다면, 공백이 엄청 여러개죠. 단어 수는 2개인데 공백이 여러개니 공백이 등장할 때마다 단어수를 카운팅해준다면 단어수가 여러개라는 잘못된 결론이 도출될  것입니다. 그렇기 때문에 "처음으로" 공백이 아닌 문자가 등장했을 때먼 새 단어가 등장했구나 하고 단어 수가 새롭게 카운팅 될 수 있어야 합니다. 그래서 word_flag 가 사용되는 것입니다.새 단어가 등장했구나, 즉 "여태 공백 혹은 줄바꿈 문자이다가 처음으로 알파벳 문자" 가 등장했구나, 라는 것을 알기 위해선 우선 공백 혹은 줄바꿈 문자가 등장하면 word_flag 를 true 로 바꾸면 됩니다. 그러면 처음으로 !isspace(c) 즉 공백이 아닌 문자가 처음으로 등장하였는데 word_flag 가 true 인 상태면 이게 바로 여태까지 쭉 공백 혹은 줄바꿈 문자였는데 처음으로 알파벳 문자가 등장했다는 소리이니, 이건 새 '단어' 의 시작이라는 의미니까 단어 수를 카운팅할 수 있겠죠.

if (isspace(c)) word_flag = false; 👉 공백 혹은 줄바꿈 문자가 등장하면 지금은 단어가 아닌 상태이므로 word_flag 를 false 로 둡니다. 예를들면 "Hello             World" 이 문장에서 중간에 공백들은 여기에 걸리겠네요.

if (!isspace(c) && !word_flag) {n_ words++; word_flag = true; } 👉 공백이 아닌 문자인데 word_flag 가 false 이다. 이것은 여태까지 공백이였는데 처음으로 공백이 아닌 알파벳 문자가 등장했다는 소리이므로 위에서 설명드린것과 같이 새로운 단어가 나타났다는 의미가 됩니다. 그러니 단어수 n_words 를 카운팅 해줍니다. 예를들면 "Hello             World" 이 문장에서 단어의 첫번째 문자인 'H' 와 'W'가  여기에 걸리겠네요.

단어 수 설명은 여기까지입니다.

if (!isspace(c)) n_chars++; 👉 이건 전체 문자수를 세는 것입니다. 그냥 단순하게 공백이나 줄바꿈 문자가 아니면 다 그냥 문자수이죠! 예를들어 "Hello World" 이런 문장이 있다면 전체 문자수는 10입니다. 공백이나 줄바꿈은 문자수로 치지 않을 것이기 때문에 공백이나 줄바꿈이 아닐 때만 문자수를 세는 것이구요.

line_flag 도 제가 위에서 설명 드린 word_flag 와 똑같이 이해하시면 됩니다. '몇 줄이냐' 를 판별할 때도 처음으로 줄바꿈이 아닌 문자가 등장했을 때 n_lines 줄을 카운팅 하면 되겠죠!

He

/n

/n

/n

llo

중간에 몇줄을 띄어 쓴 이런 문장이 있더라도 알파벳 문자가 있는 것만 줄 수로 판단할 것이기 때문에 "2 줄"로 판단할 것입니다. 따라서 이는 n_ words 셀 때 처럼, 줄바꿈 문자가 등장했을 떈 line_flag 를 false 로 해주어 지금 줄바꿈 문자 상태라는 것을 인지해두고, line_flag == false 상태이다가 처음으로 줄바꿈이 아닌 문자가 등장하면 !isspace(c) 이것은 여태 줄바꿈 상태였는데 처음으로 문자가 등장했다는 것이므로 새로운 줄이 등장했다는 의미가 됩니다. 따라서 이럴때만 라인 수 n_lines 를 카운팅하는 것입니다.

질문은 연관 강의에서 질문을 해주셔야 하기 때문에 7.8 강의에 대해 질문 주신 것이니 7.8 강의의 질문탭에서 질문글을 써주셔야 합니다. 그래야 제가 강의를 참고하기도 편하고 7.8강의 듣는 다른분들도 질문자님의 글을 참고할 수 있거든요. 다음부턴 공지대로 연관 강의에서 질문글을 써주시길 부탁드립니다.