왜 틀렸을까

2015. 6. 4. 08:41알고리즘 문제풀기

답을 제출하고, 채점 결과를 보았고, 틀렸다.

컴파일을 했고, 컴파일이 안 되었다.

예제 데이터에서 답이 제대로 나오지 않는다.

무한 루프를 돈다.

런타임 에러가 난다.

왜일까?


1) 소스의 오류

  : 소스에 허점이 있다.

전체적인 구조와 논리, 설계는 옳은 방향이나 그 구현이 잘못된 것이다.

  - 변수명을 확인하자.  i, j, k가 섞였는가?  모든 변수 사용 하나 하나를 면밀히 관찰하자. 그 위치에서 사용해야 할 변수가 그것이 맞는가? 그 변수가 거기서 어떤 값을 가지는가? 처음에 세운 논리에 부합하는가? 함수 이름도 다시 한 번 확인하자.

  - Overflow에 유의하자. 중간에 signed 32-bit를 넘어가는 값(약 21억, 2 뒤에 0이 9개)은 없는가? 곱하기는 long long으로 캐스팅하자. 모든 곱셈과 덧셈을 다시 보자. 나머지를 계산하는 문제에서 뺄셈을 쓰면 안 된다. a-b === a+(m-b)임을 기억하자. GCD로 나누거나 나머지를 취하는 방법은 없는가?

  - for( ㅁㅁ; ㅁㅁ; ㅁㅁ);   << 이런 부분은 없는가?

  - 비교 연산을 주의하자. ==과 =을 헷갈리지 않았는가?

  - 재귀함수 내부에서 전역변수의 값을 바꾼다면 주의하자. 전역변수 a가 2이지만, 재귀 호출 이후 10으로 바뀔 수도 있다. 원래 값이 필요하다면 저장하자.

  - 메모리가 부족하지 않은가? 재귀 함수를 너무 많이 호출하지 말아야 한다.

  - 배열 참조를 모두 다시 한 번 확인하자. [] 안에 들어있는 값은 항상 배열 범위 내일까? 혹시 20까지 참조하는데 [20]으로 잡지는 않았는가? (이것 때문에 고생한 경험이 많음에도 불구하고 몇 주 전 이것 때문에 2시간 정도를 보냈다...)


2) 논리의 오류

  : 소스의 오류와도 관련이 있다. 논리적으로 옳지 않은 솔루션인 경우이다. 이건 어쩔 수 없다. 생각한 솔루션을 정확하게 구현했음에도 불구하고 WA 등이 나온다면 완전히 틀려서인 경우이다. 가장 잡기 힘든 오류인데, 일반적으로 이 솔루션이 맞다고 가정하거나 추측하거나 (잘못되게) 증명한 경우 코딩을 시작하기 때문이다. 대회 중에는 WA를 봐도 이게 내 솔루션이 잘못된건지 코딩에서 실수한 건지 알 수 없기 때문에 생각을 명확히 하는 것이 중요하다.