mssggg   1년 전

체점하는데 10%정도에서 계속 틀렸다고 하네요 

근데 어디가 틀린지 도저히 모르겠습니다 ,,

wizardrabbit   1년 전

안녕하세요? 해당 코드를 저격하는 반례입니다:

입력:
dz=dz=

정답:
2

출력:
3
preview

▶ 틀린 이유 한 줄 요약: "dz=", "z=" 가 모두 매칭이 가능한 상황에서 "z=" 를 먼저 매칭하는 경우가 생깁니다.

"dz=" 와 "z=" 가 모두 매칭이 가능한 상황에서는 무조건 "dz=" 을 매칭하는 것이 유리합니다. "z=" 를 먼저 매칭하면 "d" 가 남게 되며, 이 d는 다른 크로아티아 알파벳과 합쳐질 수 없기 때문에 그대로 남아 한 글자를 차지하기 때문입니다.

따라서 올바른 방법은 먼저 "dz=" 를 모두 매칭한 다음, 남은 문자열에서 "z=" 를 매칭하면 됩니다. 하지만 질문자님의 코드는 "c=" 부터 "z=" 까지 계속 돌아가면서 한 개의 문자열만 매칭해 바꾸고 있기 때문에, 위 그림과 같이 "dz=" 를 먼저 찾은 상황에서 "dz=" 를 또 찾지 않고 "z=" 를 찾게 되어 틀리게 되는 것입니다.

따라서 올바른 해결 방법은 주어진 크로아티아 알파벳 순서대로 모든 케이스를 매칭하는 것입니다. "c=" 를 모두 찾은 다음 "c-" 를 찾고, "c-" 를 모두 찾은 다음 "dz=" 를 찾고, ... 와 같은 방식으로요. 이렇게 하신다면 정답을 받으실 수 있을 것입니다.

그리고 질문자님께서 문자열을 바꾸실 때

S = S[0:S.index(i)] + '_' + S[S.index(i)+len(i):]

와 같이 코드를 사용하셨는데, 이것보다 좀 더 간편하게 문자열을 바꿀 방법이 있습니다. 바로

S = S.replace(i, '_')

와 같이 replace() 함수를 사용하는 것이죠. replace() 함수는 문자열 내에서 바꾸고자 하는 문자열과 바꿀 문자열을 지정하면, 문자열 내에서 바꾸고자 하는 모든 문자열을 검색해 지정한 문자열로 바꿀 수 있습니다. 문자열 S가 있고, 여기에서 모든 "dz=" 을 찾아 "_" 로 바꾸고 싶으실 경우의 예시는 아래와 같습니다:

S = S.replace("dz=", "_")

이렇게 하면 좀 더 코드가 깔끔해질 것 같습니다. replace() 를 사용해 모든 크로아티아 알파벳을 찾아 "_" 로 바꾼 후, 남은 문자열 S의 길이만 출력하는 방법으로도 풀 수 있습니다.

문제가 해결되기를 바랍니다!

mssggg   1년 전

감사합니다 ㅜㅜ

ssuamje   1년 전

와 뭐야 이 미친듯한 친절함

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