jaksfj   2년 전

전 질문에서 답으로 y까지 돌리셨다고 오류점을 지적해주셔서 z까지 돌리고 

출력값 끝에 띄어쓰기가 있는 것을 확인해서 그 문제도 보완해서 정답과 같은 출력값을 출력하였는데도 틀렸다고 합니다.. 어디서부터 잘못된건지 모르겠습니다ㅠ 도움을 요청합니다,,

g072923   2년 전

i가 y일떄 continue 하는 이유가 무엇인가요

wizardrabbit   2년 전

안녕하세요? 디버깅 결과 틀린 점을 찾았습니다.

틀린 이유 #1 : 단어에서 알파벳 'z' 를 검사하지 않습니다.

입력: z
정답: -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 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 -1

코드의 8번째 줄의 반복문에 의하면 i 값은 'a' 부터 시작해서 'z' 이전까지 검사하겠네요. i < 'z' 이므로 z를 포함하지 않고 'y' 까지만 문자열을 검사하게 됩니다. 'z' 도 검사하여야 하므로 i < 'z' 는 i <= 'z' 로 바꾸는 것이 바람직해 보입니다.

틀린 이유 #2 : 코드의 25~29번째 줄이 잘못 작성되었습니다.

입력: aab
정답: 0 2 -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 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

해당하는 부분의 코드가 작성된 의도는 잘 모르겠습니다... 하지만 문제 특성상 알파벳이 등장할 경우 가장 첫 번째로 등장한 알파벳만 검사해 위치를 기록해야 하므로, 질문자님께서 작성한 코드가 이 의도인 것으로 생각해 보겠습니다.

코드대로라면 s[j] 에서 찾고자 하는 알파벳을 찾았을 경우 알파벳을 찾은 횟수를 기록하는 변수 c의 값을 1 증가시키고 해당 위치를 출력하되, s[j + 1]도 해당 알파벳일 경우에는 c의 값을 0으로 해 찾지 못한 것으로 처리하게 됩니다. 그렇기 때문에 반례의 입력을 예로 들면, a를 찾는 과정에서 첫 번째 문자가 'a' 이므로 'a'의 인덱스인 0이 출력되고, 이어서 다음 문자(s[j + 1]) 도 'a' 이므로 c가 0이 되어 -1도 출력되게 됩니다. 즉 'a' 문자 하나를 찾는 과정에서 두 번의 숫자가 출력되어 프로그램이 의도와 다르게 동작하게 됩니다.

이 부분에 대해서는 의도와 맞게 프로그램이 동작하도록 제가 테스트한 코드를 첨부하겠습니다. 참고용으로 사용하세요! 13~30번째 줄의 코드를 제가 첨부한 코드로 변경하시면 됩니다.

첨부한 코드를 간단히 설명드리자면 s[j] == i, 즉 문자를 찾았을 경우 해당 위치를 즉시 출력하고, 해당 문자를 더 찾을 필요가 없으므로 바로 break로 반복문을 빠져나오도록 한 것입니다. 반복문을 빠져나오면 프로그램은 바로 다음 문자에 대한 탐색을 시작하겠지요. 만약 찾지 못해 c 값이 0일 경우에는 32번째 줄부터 코드가 실행되어 -1를 출력하게 됩니다. 이렇게 하면 문제의 의도에 맞게 출력을 할 수 있습니다.

참고사항

대부분의 문제의 경우 각 줄의 맨 끝에 공백을 넣어도 되고 안 넣어도 되며, 출력의 맨 끝에 줄바꿈을 넣어도 되고 안 넣어도 됩니다. https://www.acmicpc.net/blog/v... 를 참고해 보세요. 고로 제가 첨부한 코드처럼 출력을 해 맨 끝에 공백이 한 칸 출력되도 상관 없습니다.

wizardrabbit   2년 전

질문자님의 코드를 적절히 수정해서 맞았습니다!! 를 받은 코드입니다. 문제를 맞추시면 해당 코드를 열람하실 수 있습니다.

https://www.acmicpc.net/source...

jaksfj   2년 전

덕분에 잘 해결할 수 있었습니다! 제가 착각했던 부분을 이해할 수 있도록 제대로 콕 집어주셔서 감사합니다! 늦은시간에 감사드립니다!

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