rlaehdgks12   2년 전

왜 안돌아가는 걸까요? ㅠㅠ

wizardrabbit   2년 전

안녕하세요! 올려주신 코드를 디버깅 해 보았고, 두 가지 문제를 찾았습니다.

1) 크로아티아 문자가 문자열의 처음에 올 경우 감지하지 못 합니다.

입력: lj
정답: 1
출력: 2

크로아티아 문자가 문자열의 처음에 왔을 경우 감지하지 못 한 이유는 바로 find() 함수의 결과를 판단하는 조건문에 있었습니다. 파이썬의 find() 함수는 찾고자 하는 문자열과 일치하는 문자열을 찾아 그 인덱스를 반환합니다. 만약 찾지 못 했을 경우, -1을 반환합니다.

그러므로, find()의 결과가 0인 경우는 문자열을 찾지 못 했다는 것이 아니라, 인덱스 0번에서 해당 문자열이 발견, 즉 문자열의 처음에서 문자열을 찾았다는 의미가 됩니다. 작성하신 코드는 find()의 결과가 0보다 큰 경우를 문자열을 찾은 것으로 처리하므로, find()가 0일 경우 크로아티아 문자열을 지나치게 됩니다.

2) 문자열을 지우는 과정에서 남은 문자열이 합쳐져 새로운 크로아티아 문자열이 생기는 경우도 크로아티아 문자열로 세고 있습니다.

입력: alljj
정답: 4
출력: 3

'lj' 는 크로아티아 알파벳이므로 총 알파벳의 개수는 'a', 'l', 'lj', 'j' 로 4가 출력되어야 합니다.

alljj -> alj -> a

↑ 반례가 입력되었을 때 코드 내에서 문자열이 지워지는 과정입니다. alljj에 있는 크로아티아 알파벳은 'lj' 하나지만, 'lj' 를 찾아 지운 후 남은 'al' 과 'j' 가 합쳐져 'alj' 이 되어 또 다른 크로아티아 알파벳이 만들어진 경우입니다. 당연하지만 이 경우에는 크로아티아 알파벳이 아니게 됩니다. 

따라서 이 반례가 생기지 않도록 하려면 크로아티아 알파벳을 찾은 후 지웠을 때 남은 알파벳이 크로아티아 알파벳을 이루지 못 하도록 해야 합니다. 제가 이 문제를 풀었을 때는 찾은 크로아티아 알파벳을 아예 지우는 대신, 'A' 같은 절대 다른 문자열과 조합되어 크로아티아 알파벳이 되는 경우가 없는 문자로 바꿨습니다.

alljj -> alAj

↑ 바로 이런 식으로요! 이렇게 하면 위의 반례가 생기는 것을 막을 수 있게 됩니다.

이상 코드를 디버깅하면서 찾은 문제점 두 가지를 설명드렸고, 문제를 해결하는 코드는 첨부해 두었으니, 스스로 해결하고 싶으시다면 아래의 코드는 보지 마시고, 도저히 답이 안 나온다 싶으시면 아래의 코드를 참고하시면서 문제를 해결하시면 될 것 같습니다.

제 설명이 도움이 되었기를 바랍니다.

rlaehdgks12   2년 전

감사합니다 선생님 덕분에 문제가 해결되었습니다. ㅎㅎ

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