maple19out   4년 전

저 같은 경우 4가지 경우를 생각했습니다.

  1. 단순히 + 혹은 - 버튼을 연타하여서 채널을 이동하는 방법(option[0])
  2. 이동하려는 채널과 같은 자리수의 가능한 수 중 그 차이가 최소가 되는 방법(option[1])
  3. 이동하려는 채널보다 한 자리수 작은 가능한 수 중 그 차이가 최소가 되는 방법(option[2])
  4. 이동하려는 채널보다 한 자리수 큰 가능한 수 중 그 차이가 최소가 되는 방법(option[3])

위 4가지 경우 중에서 가장 최소인 option을 선택하는 방법으로 코드를 작성하였고 게시판의 반례들을 입력하여 올바르게 출력되었지만 여전히 틀렸다고 나옵니다. 한 번 봐주시면 감사하겠습니다. 

추가적으로 이런 부르트 포스 문제 반례를 찾아주시는 분들은 어떻게 찾으시는 건지도 궁금합니다. 경우의 수가 일일이 대입해보기에는 많은데 코드의 잘못된 논리를 찾아서 반례를 찾아내시는 건가요? 아니면 이미 통과한 코드에 자동으로 경우의 수를 입력하는 프로그램같은 것을 만들어서 틀렸다고 나오는 코드와 결과값을 비교해 다른 부분의 tc를 가려내는 것인가요?

seico75   4년 전

2229
6
4 5 6 7 8 9

위의 경우는 코드를 보고 이상한 부분을 찾고 그 경우에 걸리는 케이스를 만들었습니다.

보통은 반례를 찾을 때 말씀하신 방법을 다 사용합니다.

  1. 코너 케이스를 넣어본다. (가장 큰값, 가장 작은 값.)
  2. 로직 상 분기가 되는 모든 케이스에 대표 예 (위의 경우 각 Option 에 해당하는 케이스)
  3. 느리지만 정확한 답이 나오는 소스와 임의의 값이나 대표값들의 결과값을 비교
  4. (남의 소스인 경우) 로직상 이상한 부분을 건드리는 예

maple19out   4년 전

정말 감사합니다. 제시해 주신 반례 덕분에 제 코드의 논리적 허점을 발견하였습니다. 아직 해결은 못 하였지만 보완을 해서 마무리 지을 수 있도록 하겠습니다!

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