12번에 바꿔주는 부분이 잘못됐습니다.
aa와 ab가 있으면 a?이 나와야 하지만 a와 b를 비교한 뒤 앞에 있는 a가 교체되면서 ?a가 됩니다.
1032번 - 명령 프롬프트
안녕하세요? 도움이 될까 글 남깁니다.
결론 부터 말씀드리면 replace 함수를 사용해서 틀린 것 같습니다.
반례는
3
asa
aca
acd
정답
a??
출력
??a
.replace(old,new,count) 에서 count의 디폴트 값은 -1로 old에 해당하는 모든 값을 new 로 바꾸는 것인데 count의 인자를 바꿔준다면 앞에서 차례대로 해당 값을 바꿔준다는 설명이 있네요. 파이팅하십쇼
안녕하세요? 반례 드립니다:
입력: 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년 전
예시에 나온 입력에 맞춰서 맞는 출력만을 보여주는거 같은데, 어디가 잘못된건지 잘 모르겠습니다.
알려주신다면 감사하겠습니다.