jeong5728   1년 전

예제 입력 출력 전부 잘 작동하고, 지워지지 않은 수 일 때의 처리까지 문자열 비교로 잘 계산하고 있는 것 같은데 자꾸 1%에서 틀렸습니다가 뜨네요.

wizardrabbit   1년 전

안녕하세요? 해당 코드의 반례를 첨부했습니다. 반례 데이터가 깁니다만 1, 2, 3, ..., 100 까지의 수를 공백 없이 나열하고 그 뒤에 11을 붙였을 뿐입니다.

해당 반례에 대한 정답은 1부터 100까지의 모든 수가 이미 있고, 다음 수인 101의 경우 가운데의 0이 사라진 11이 반례 데이터의 끝부분에 붙어 있으므로 101이 정답이 될 수 있을 것입니다. 하지만 질문자님의 코드는 102를 출력합니다.

질문자님도 아시다시피, 가능한 경우의 최솟값을 출력하려면 1부터 차례대로 수를 넣어보면서 입력으로 주어진 문자열에 있는 수와 가능한 한 많이 일치시켜야 합니다. 질문자님의 코드의 24번째 줄에는 아래의 코드가 있는데,

if(a[k] !== b[k]) break;

이 코드대로 진행하면 비교하고 있는 수와 입력으로 주어진 문자열이 일치하지 않는 순간 바로 다음 수로 넘어갈 것입니다. 하지만, 일치하지 않는 부분이 중간에 있다 하더라도 그 뒤의 문자열은 일치하는 경우가 생길 수가 있습니다. 이해를 돕기 위해, 하단에 제시한 반례를 예로 들어봅시다.

preview

위의 케이스와 아래의 케이스를 비교해 보시면 될 것 같습니다. 위의 케이스가 질문자님의 코드, 아래의 케이스가 올바른 코드라고 할 수 있겠습니다.

질문자님의 코드의 경우 두 번째에서 101의 '0' 이 일치시키지 않아 다음 수로 넘어가기 때문에 주어진 수 101에서 모든 문자열을 일치시키지 못 하고 102에서 모든 문자열을 일치시키게 됩니다. 하지만 아래의 케이스와 같이, 중간에 '0' 이 일치하지 않더라도 그 다음으로 오는 '1' 과 일치하는 경우가 생길 수 있습니다. 아래의 케이스는 주어진 수 101 내에서 모든 문자열을 일치시키는 데 성공하여 정답인 101을 얻을 수 있게 됩니다.

이 반례를 참고하셔서 코드를 적절히 수정하시면 될 것 같습니다!

jeong5728   1년 전

알려주셔서 감사합니다!

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