ddd01812   2년 전

질문들을 보면서 

배열 사이즈를 딱 100개로 하면 안된다고 하셔서 101로 늘려도 보고 결과값 출력해주는 배열의 크기도 늘려보고 했는데 도무지 뭐가 문제인지 모르겠습니다  ㅠㅠ 

0000000000   2년 전

20line for문 범위가 잘못 된 것 같습니다.

wizardrabbit   2년 전

안녕하세요? 윗분께서 이미 어디가 틀렸는지를 말씀해 주셨으니, 저는 반례와 부가 설명을 하겠습니다. 반례입니다:

입력: aaaaaaaaaaaaaaaaaaaaaaaaaab
정답: 0 26 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
출력: 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

프로그램이 b를 감지하지 못해 -1가 출력되는 것이 보이시지요? 왜냐하면, 반복문의 20번째 줄의 반복 범위는 i가 25일 때부터 0일 때까지니, 입력된 문자열의 25번째 문자열부터 0번째 문자열까지밖에 검사하지 않습니다. 그렇기 때문에 인덱스 26부터 오는 문자는(반례에서는 b) 검사하지 못 하는 것이죠. 그러므로, 입력되는 문자열의 최대 크기를 고려해 범위를 수정해 주시면 될 것 같네요.

그리고 한 가지 더, 범위를 적절히 수정하더라도 여전히 틀렸습니다를 받을 것입니다. 그 이유는 입력된 문자열을 저장하는 main[]에 쓰레기 값이 저장될 수 있기 때문입니다. 변수의 값을 초기화를 하지 않아 임의의 값, 예를 들면 -4953485345 같은 값이 저장된 것을 쓰레기값이라고 합니다. 이 저장되는 쓰레기값은 무작위이기 때문에, 내버려 두면 프로그램이 오작동을 일으킬 수도 있습니다. 프로그램에서 main[]의 크기는 101인데 입력된 문자열이 10, 20같이 작은 값일 경우 main[]에서 남는 공간이 생기고 쓰레기값이 그대로 남겠지요? 이를 내버려 둘 경우 이후 프로그램에서 값을 탐색할 때 쓰레기값도 탐색하게 되어 의도와 다른 결과가 나올 수도 있습니다. 그러므로 이러한 오류를 막기 위해 배열을 초기화하는 작업이 권장됩니다. 예를 들어, main[]의 모든 값을 미리 0으로 초기화시키면, 이후 문자열 입력이 들어올 경우 문자열 입력이 들어오지 않아 빈 배열에는 0이 저장되어 있으므로 프로그램에서 해당 값이 비어있음을 알 수 있게 됩니다. 그렇게 하면 21번째 줄에서 알파벳임을 판단할 때 0이 저장된 배열은 지나칠 수 있게 되죠.

결론적으로 질문자님이 하셔야 하실 작업은 두 가지입니다.

1) 문자열을 탐색하는 범위를 수정해 입력으로 들어오는 모든 글자를 제대로 탐색할 수 있도록 하기

2) 배열을 먼저 초기화해 쓰레기값을 치워 이후 프로그램이 오작동하는 것을 막기

문제 해결에 도움이 되기를 바랍니다.

ddd01812   2년 전

답변해주신 두 분께 정말 감사드립니다. 상세한 설명을 읽고 쓰레기값이라는 개념에 대해서 다시 생각해보게 되었습니다!! for loop을 만들때 checker 배열에 알파벳 갯수만 생각하다가 변수 i도 25로 해버리는 어이없는 실수를 해버렸네요 범위 수정과 배열 초기화후 바로 정답을 받을 수 있었습니다. 배열 쓰레기값 개념에 대해서 상세한 설명해 주셔서 너무너무 감사합니다! 우울한 마음이 사라졌어요 :)

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