freshwind   3년 전

COUNT함수에 숫자가 들어가든 ' '이 들어가든 return 이 1이 나와서

if (COUNT(arr[i]) == 1 && arr[i + 1] == ' ') 이 참이 되어서 

'    ' 이렇게 스페이스만 쳐도 단어의 개수가 합산돼서 나옵니다.

물론 '공백이 연속해서 나오는 경우는 없다.' 라고 문제에 명시 되어있지만

분명 공백이 연속으로 나와도 단어로 합산 되지 않게 코드를 짰는데 왜 단어로 합산되어서 나올까요?

dldyddlwl   3년 전

1. 일단 스페이스만 쳐도 1이 나오는 이유는 애초에 for 루프를 들어가지도 않고, 출력문에 count+1이 되므로, 1이 나오게 됩니다. 따라서 이 부분을 생각해주시면 됩니다.

2. 그리고, 마지막에 스페이스가 나오는 경우가 문제가 됩니다.

예] a공백b공백

글쓴이님의 코드] 3

기존의 if문이 arr[i]가 문자이고, arr[i+1]가 공백일 때, count를 올리는 것인데, 마지막에 공백이 올 경우, 1개를 추가로 더 세버립니다. 따라서, 이 마지막에 공백이 오는 경우만

따로 생각해주시면 됩니다!

freshwind   3년 전

선생님 감사합니다!

궁금한게 하나더 있는데

'   ' 이렇게 스페이스만 세번 쳤을때 3이 출력되는 이유를 모르겠습니다.

dldyddlwl   3년 전

실제로 alphabet 배열에 들어있는 것은 문자 0이 아닙니다! 값은 0이긴 하지요. 뭔가 헷갈릴 수 있을 것 같은데

0 != '0' 이렇게 하면 이해가 쉽게 될 것 같습니다. 즉, 저희는, 배열에 처음에 0을 대입했습니다. 아스키코드를 보시면 0은 NUL로 정의되어있습니다. 그리고 '0'은 아스키코드 상 48번이죠.

그러면 i가 계속 증가하다가 우연히 '0'을 만나는 순간 끝나게 됩니다. 그 와중에 카운트를 세는 if문에 걸리면 의도치않게 카운트가 세지겠지요.

스페이스가 아닌 일반 문자가 주어진다면 break에 걸려서 탈출할테니 이런 문제가 생기지 않았던 것입니다.

freshwind   3년 전

선생님 정말 감사합니다!

말씀해 주신 문제점들을 모두 반영해서 위에 코드를 수정해서 올렸습니다.

위에처럼 수정을 했는데도 

또다시  '    ' 이렇게 스페이스만 세번 입력하면 3이 출력됩니다.

왜 그런지 전혀모르겠습니다.

dldyddlwl   3년 전

위에서 말했듯이, alphabet[i] != '0' 이 아닌 alphabet[i] != 0 이 정확한 표현입니다!

freshwind   3년 전

char alphabet[70] = { 0, };

for (i = 0; alphabet[i] != 0; i++)

이 부분만 0 이든 '0' 이든 같으면 똑같은 상황 아닌가요?

또, alphabet[i] != 0으로 하면 모든 경우가 0 으로 출력됩니다.

어떤 부분이 문제인지 아직도 모르겠습니다.

dldyddlwl   3년 전

아 수정된 글을 못봤습니다. 아래의 첫번째 if문은  기존의 마지막에 스페이스가 오는 경우를 해결해주는 것이 아닙니다.

첫번쨰 if문에서 생긴 문제입니다. 그러니까, 첫번째 if문이 그대로 있으므로 여전히 문제입니다

자 그리고, 아 제가 수정된 코드를 제대로 못봤습니다 죄송합니다.


또 문제는, alphabet[70] = { '0' , };

은 모든 원소를 '0'으로 채워주는 것이 아닙니다. 첫번째 원소는 '0'으로 채우되, 나머지 원소는 기본값인 0으로 초기화해줍니다. 그래서 제가 0을 썼던 것이고요.

 

또한, 대소문자 모두 등장할 수 있으니 for (i = 'A'; i <= 'a'; i++) 에서 'A' 부터 'z'까지가 옳은 표현이겠죠?

자, 그리고 0이 나온 이유를 분석해봅시다.


기존에는 count를 출력하실 떄, count+1으로 출력하셨죠? 그런데 그 부분을 빼니, 이제 한 단어에서는 계속 카운트가 0이 나오는 겁니다.
두 단어를 입력하면 1이 나옵니다. 

=> 그러면 공백 하나만 출력하는 경우에 1이 더해져서 곤란한 것이었습니다. 그렇다면 공백 하나만 입력된 경우엔 count에 1을 더하지 않으면 되겠죠?

댓글을 작성하려면 로그인해야 합니다.