psmin0325   1년 전

예시에 나온 입력에 맞춰서 맞는 출력만을 보여주는거 같은데, 어디가 잘못된건지 잘 모르겠습니다.

알려주신다면 감사하겠습니다.

chldn323   1년 전

12번에 바꿔주는 부분이 잘못됐습니다.

aa와 ab가 있으면 a?이 나와야 하지만 a와 b를 비교한 뒤 앞에 있는 a가 교체되면서 ?a가 됩니다.

gyeongmin951   1년 전

안녕하세요? 도움이 될까 글 남깁니다.

결론 부터 말씀드리면 replace 함수를 사용해서 틀린 것 같습니다.

반례는

3

asa

aca

acd

정답

a??

출력

??a

.replace(old,new,count)  에서 count의 디폴트 값은 -1로 old에 해당하는 모든 값을 new 로 바꾸는 것인데 count의 인자를 바꿔준다면 앞에서 차례대로 해당 값을 바꿔준다는 설명이 있네요. 파이팅하십쇼

wizardrabbit   1년 전

안녕하세요? 반례 드립니다:

입력:
2
aaaaaaa
aaxaxaa

정답:
aa?a?aa

출력:
??aaaaa

틀린 원인은 다른 값을 만났을 때 문자열 base의 다른 부분을 '?' 로 바꿔 주는 부분이었습니다.

base = base.replace(base[j], '?', 1)

질문자님께서는 위의 코드를 'base 문자열의 j 번째 문자열을 '?' 로 바꾼다' 로 의도하시고 코드를 작성하신 것 같습니다만, 실제로는 다르게 동작합니다.

파이썬의 replace()는 문자열에서 지정한 문자열을 찾아 원하는 문자열로 바꾸는 기능을 제공합니다. 작성하신 코드에서는 base[j] 를 '?' 로 바꾸게 됩니다. 반례에서의 base[j] 는 'a' 이므로, 'a' 를 '?' 로 바꾸는 코드가 됩니다. 즉 해당 줄의 의미는 '검색하면서 처음으로 나오는 'a' 를 '?' 로 바꿔라' 가 됩니다. 의도하신 것과는 다르지요?

다른 부분에 해당하는 인덱스의 문자를 '?' 로 바꿔야 하는데, 다른 부분에 해당하는 인덱스의 문자를 검색해서 첫 번째로 나오는 문자를 '?' 로 교체하게 되는 것입니다. 그러므로 반례에서 세 번째 문자가 서로 다를 때 세 번째의 'a' 문자열을 교체하려는 시도는 당연히 처음으로 검색되는 첫 번째 문자인 'a' 를 교체하는 것이 됩니다.

문제를 해결하는 힌트를 드리자면, 다른 부분을 찾았을 경우에는 replace() 를 사용할 필요 없이, 해당 인덱스에 해당하는 문자를 '?' 로 바꾸기만 하면 됩니다. base[N] = '?' 와 같이요. 하지만 파이썬에서 문자열은 immutable 한 객체이므로 값을 변경할 수 없습니다. 이를 해결하기 위해 base를 값을 변경할 수 있는 형태인 리스트로 바꾸어 처리하는 방법을 생각할 수 있으며, 마지막 출력에서는 join() 등을 사용하여 리스트를 다시 문자열로 합치는 방법을 사용할 수 있습니다.

문제가 해결되기를 바라겠습니다.

psmin0325   1년 전

친절한 답변들 감사드립니다. 덕분에 문제가 뭐였는지 알수 있었습니다. 좋은 하루보내세요 ㅎㅎ

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