20line for문 범위가 잘못 된 것 같습니다.
10809번 - 알파벳 찾기
20line for문 범위가 잘못 된 것 같습니다.
안녕하세요? 윗분께서 이미 어디가 틀렸는지를 말씀해 주셨으니, 저는 반례와 부가 설명을 하겠습니다. 반례입니다:
입력: 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년 전
질문들을 보면서
배열 사이즈를 딱 100개로 하면 안된다고 하셔서 101로 늘려도 보고 결과값 출력해주는 배열의 크기도 늘려보고 했는데 도무지 뭐가 문제인지 모르겠습니다 ㅠㅠ