thankyouoov   6년 전

위 코드와 밑에 코드는 문자열 입력받는 부분만 다릅니다.

위에 코드는 cin.get을 for문을 이용해서 입력받고

아래코드는 cin.get(a, 1000000)함수를 이용해서 입력받습니다.

결과로는 위에 코드는 틀렸다고 뜨고 아래코드는 정답이라고 뜹니다. 

차이가 무엇인지 너무 궁금합니다.

seico75   6년 전

아마도 최대 길이의 문자열이 들어갔을때의 동작이 달라질 것 같습니다.


예를 쉽게 들기 위해서 10이 최대라고 하면, 지금 10의 크기 배열을 잡으신건데

abc efghij\n 의 입력이 들어오면

첫번째는 9개(n-1=10-1) 혹은 \n 이 들어올때까지 읽고 \0를 집어 넣어서

abc efghi\0

가 들어갑니다.  마지막 한글자만 못 읽었네요.

두번째는 10개를 모두 읽습니다.

abc efghij

대신 \n이나 \0가 없겠네요.


그 다음 loop 는 \0나 \n 까지 돌면서 워드를 세는데, 

첫번째는 마지막 한글자가 없지만 워드 수는 동일하므로 정답이 나오고

두번째는 10을 넘어서 쓰레기 값을 가지고 돌겠죠. 언젠가 \0이나 \n을 만나겠지만 " "도 있을 것이므로 워드수는 달라지겠죠.


thankyouoov   6년 전

시간내서 답변해주셔서 정말 감사드립니다!


그치만 말씀해주신 부분에 잘못된 부분이 있는거 같아요ㅜ

두번째 코드가 정답이라고 뜨고 첫번째 코드가 틀렸다고 뜨네요..

그래서 배열의 크기 문제인가해서 크기를 늘려봐도 틀렸다고 뜨네요. 도무지 감을 못잡겠습니다..

seico75   6년 전

제가 모바일에서 소스를 보면서 쓰지 않아서 첫번째 두번째가 바뀌었네요.

제 글에서 첫번째와 두번째를 바꿔서 보시면 될꺼 같습니다.

결론은 배열크기를 1만큼 늘려보세요.

wayway910   6년 전

첫번째 소스에서 다음 부분을 아래 check() 함수로 바꾸고, 리턴값을 이용해서 확인하도록 바꾸면 정답이 되네요.

if (a[i] == '\n') { 

if (a[i] == '\n' || a[i] == NULL) {


이로 보아 test case 중에서 입력 끝 문자가 '\n' '\r' '\0' 이 아닌 경우가 있어서 정답이 안된 게 아닐까요??

두번째 소스에선 끝 문자를 자동으로 널문자로 변경하니 이와 상관없이 정답이지 않나 추측해봅니다.

thankyouoov   6년 전

seico75님 1 더 늘려도 똑같은 에러가 뜨네요ㅜ  님이 하신 설명은 분명 맞는거 같은데 안되네요. 그래도 설명 잘해주셔서 정말 감사드립니다!!

wayway910님 아무래도 입력에서 \n \r \t 등의 다른 입력이 들어오는거 같네요ㅜ 100%에서 틀렸다고 뜨네요.
님 덕분에 다른방법도 생각이 났습니다 정말 감사합니다!!

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