djm03178   5년 전

틀렸습니다를 받는다고, 질문 게시판 반례 한 두 개 넣어보고 맞다고 생각하고 성급하게 질문을 올리기 전에, 자신의 코드를 다시 한 번 돌아보는 시간을 가져봅시다. 내 코드는 내가 짰으니까, 내가 제일 잘 알겠죠? 내 코드 디버깅도, 내가 제일 잘 할 수 있겠죠?

  1. 각 단어를 체크할 때마다 초기화가 잘 됐는지 확인하세요. 처음에 한 번만 초기화하면 안 됩니다. 단어를 조사하기 위해 필요한 모든 변수들(예를 들면 플래그 변수, 문자가 나타나는 위치를 기록하는 배열 등)이 매 단어를 조사할 때마다 반드시 초기화가 되어 있어야 합니다. 이전 케이스에서 남겨놓은 잔해를 그대로 이어서 쓰면 안 되겠죠?
  2. 각 단어에 대해, 단 한 군데라도 "그룹 단어"의 규칙을 어기는 곳이 있다면 그 단어는 "그룹 단어"가 아닙니다. 그러니 이미 그룹 단어가 아니라는 것이 판명난 상태에서 거꾸로 되돌릴 일은 절대로 없습니다. 그런 코드가 있다면 생각을 잘못한 것입니다.
  3. 단어의 길이가 최대 100이므로, 문자열로 온전하게 담기 위해서는 널 문자를 위해 최소 101칸이 할당되어야 합니다. 만일 fgets 와 같이 개행 문자까지 저장하는 함수를 사용한다면, 개행 문자 + 널 문자까지 최소 102칸이 할당되어야 합니다.

또한 이 문제를 굉장히 어렵고 복잡하게 푸시는 분들이 많은데, 그렇게 할 필요가 없습니다. 코드를 복잡하게 짜면 예외 처리가 잘 되는 게 아니라, 오히려 예외를 못 잡는 코드를 짰기 때문에 구멍을 메우기 위해 자꾸 길어지는 것입니다. 아래의 두 조건을 어떻게 하면 간결하면서도 모든 케이스를 커버하도록 할 수 있을지 생각해 보세요.

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