Vienna
03) 코딩과 디버깅에 관하여 - 자주 하는 실수 본문
같은 실수를 반복하기보다는 실수에서 배우는 것이 좋고,
그보다 더 좋은 것은 남의 실수로부터 배워 유사한 실수를 저지르지 않는 것이다.
◇ 프로그래밍 대회에 참가한 사람들이 흔히 저지르는 실수 중 대표적인 것
◆ 산술 오버플로
변수의 표현 범위를 벗어나는 값을 사용하는 경우.
◆ 배열 범위 밖 원소에 접근
이 실수를 예방하는 가장 좋은 방법은 (당연하게도) 배열의 크기를 정할 때 계산을 신중하게 하는 것.
◆ 일관되지 않은 범위 표현 방식 사용하기
배열의 잘못된 위치를 참조하는 오류가 발생하는 큰 원인 중 하나.
프로그램 내에서 범위의 표현 방식으로 *닫힌 구간과 **열린 구간을 섞어 쓰는 경우가 있다.
*닫힌 구간: 양 끝의 경계를 포함하는 구간
**열린 구간: 양 끝의 경계를 포함하지 않는 구간
대부분의 프로그래밍 언어는 이 둘 사이의 절충안인 *반 열린 구간(half-open interval)을 사용.
첫 번째 값은 집합 안에 포함하고, 다른 하나는 집합 안에 포함하지 않는다.
*반 열린 구간: 첫 번째 값은 집합 안에 포함하고, 다른 하나는 집합 안에 포함하지 않는 방식.
◆ off-by-one 오류
off-by-one 오류는 계산의 큰 줄기는 맞지만 하나가 모자라거나 하나가 많아서 틀리는 코드의 오류들을 모두 가리킵니다.
반 열린 구간과 닫힌 구간을 서로 혼용해 쓴 경우 흔하게 발생.
방지할 수 있는 가장 좋은 방법은 최소 입력이 주어졌을 때 이 코드가 어떻게 동작할지를 되새겨 보면서 프로그램을 짜는 것.
◆ 컴파일러가 잡아주지 못하는 상수 오타
각종 상수를 잘못 입력해서 문제를 잘 풀어놓고도 오답처리 되는 경우를 종종 볼 수 있다.
리터럴로 입력하는 경우나 데이터를 따로 빼놓는 경우에 틀리게 적지 않도록 꼭 조심하자!
◆ 스택 오버플로
대개 재귀 호출의 깊이가 너무 깊어져서 오는데, 이 점은 늘 유의하는 것이 좋다.
스택의 최대 크기는 컴파일이나 실행 시 설정할 수 있고, 기본값이 언어나 아키텍쳐 등에 따라 매우 다르기 때문에 대회에서 사용하는 환경의 스택 허용량에 대해 알아둘 필요가 있다.
◆ 다차원 배열 인덱스 순서 바꿔 쓰기
프로그래밍 대회에서는 심심찮게 4, 5차원 이상의 고차원 배열을 쓰게 된다.
이 배열을 이곳저곳에서 접근하다보면 한군데 쯤에서 인덱스의 순서를 헷갈려서 잘못 쓴느 일이 흔히 있다.
가능한 한 특정 배열에 접근하는 위치를 하나로 통일하는 것이 좋다.
◆ 최소, 최대 예외 잘못 다루기
예외라는 말 그대로, 우리가 예상한 입력의 규칙에 들어맞지 않는 모든 입력.
따라서 예외를 제대로 처리하지 못한 경우는 모호해서 일반적인 실수라고 하기 힘들지만 가능한 입력 중 최소값과 최대 값이 예외가 되는 문제들은 생각 외로 많다!
꼼꼼하게 최소/최대 예외를 처리할 수 있도록 조심하자.
◆ 연산자 우선순위 잘못 쓰기
연산자 우선순위는 종종 잡기 힘든 버그를 만든다.
때문에 연산자 간의 우선순위를 잘 기억하거나, 헷갈릴 경우 괄호로 적절히 감싸는 것을 잊지 말자.
◆ 너무 느린 입출력 방식 선택
대개의 경우 고수준 입출력 방식을 이용하면 코드가 간단해지지만, 이에 따른 속도 저하 또한 클 수 있다.
따라서 입출력의 양이 많다면 어떤 입출력 방식을 선택하는지가 프로그램의 정답 여부를 충분히 바꿔놓을만한 요소가 된다.
입력으로 받거나 출력해야 할 변수의 수가 1만 개를 넘어가면 우선 긴장하는 것이 좋다.
◆ 변수 초기화 문제
많은 프로그래밍 대회에서는 프로그램을 한 번만 실행하고, 한 번에 여러 개의 입력에 대해 답을 처리하라고 요구한다.
이 때 이전 입력에서 사용한 전역 변수 값을 초기화하지 않고 그대로 사용하지 않도록 조심해야 한다.
이런 실수를 예방하기 위한 팁 하나는 예제 입력 파일을 두 번 반복해서 쓰는 것.
그렇게 되면 에제 간의 의존 관계 때문에 우연히 답이 나오는 경우를 방지할 수 있다.
가장 좋은 방법은 새 테스트 케이스를 처리할 때마다 변수들을 적절히 초기화하도록 신경써서 코딩하는 것.
'알고리즘 문제 풀이 > 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략' 카테고리의 다른 글
03) 코딩과 디버깅에 관하여 - 좋은 코드를 짜기 위한 원칙 (1) | 2023.05.16 |
---|---|
02) 문제 해결 개관 - 문제 해결 전략 (0) | 2023.05.15 |
02) 문제 해결 개관 - 문제 해결 과정 (0) | 2023.05.10 |