[알고리즘 문제해결전략] 3.코딩과 디버깅에 관하여 - 1
[알고리즘 문제해결전략] 3.코딩과 디버깅에 관하여 - 1
1. 코딩의 중요성
빨리 코드를 작성하는 것보다 읽기 쉬운 코드로 작성해라.
- 복잡하고 읽기 어려운 코드는 디버깅도 어렵고, 한번에 정확하게 작성하기 어려움.
- 간결하고 효율적인 프로그램을 작성하는 능력은 프로그래밍 대회에서 얻어 갈 수 있는 가장 큰 소득 중 하나.
2. 좋은 코드를 짜기 위한 원칙
간결한 코드 작성하기
- 코드가 짧을 수록 오타나 단순한 버그가 생길 우려가 줄어들고, 디버깅도 쉬워진다.
- 자주 사용하는 코드의 일부를 매크로로 표현한다.
#define FOR(i,n) for(int i=0;i<n;i++)
FOR(i, arr.size()){
FOR(j,i) {
if(array[i] == array[j]) return 1;
else return 0;
}
적극적인 코드 재사용하기
- 코드를 모듈화한다.
표준 라이브러리 공부하기
- 표준 라이브러리는 셀 수 없을 정도로 많이 사용되고 검증되었기 때문에, 메모리 관리나 정당성 증명에 신경 쓸 필요없이 편하게 사용할 수 있다.
항상 같은 형태로 프로그램 작성하기
일관적이고 명료한 명명법 재사용하기
- 모호하지 않은 변수명과 함수명을 사용하는 버릇을 들이고, 사용하는 언어의 표준 라이브러리에서 사용하는 명명규약을 익히자.
모든 자료를 정규화해서 저장하기
코드와 데이터를 분리하기
3. 자주하는 실수
산술 오버플로
- 계산과정에서 변수의 표현범위를 벗어나는 값을 사용하는 산술 오버플로
배열 범위 밖 원소 접근
- 배열 크기를 정할 때 계산을 신중하게 해야한다.
일관되지 않은 범위 표현 방식 사용하기
-
배열의 잘못된 위치를 참조하는 오류가 발생하는 가장 큰 원인 중 하나.
-
대부분의 프로그래밍 언어는 반 열린 구간을 사용한다. [lo, hi) 로 lo, lo+1 …., hi-1 을 포함.
-
c++ STL에서는 반복자로 범위를 표현할 때 첫 원소를 가리키는 반복자와 마지막 원소 다음 위치를 가리키는 반복자를 사용한다.
스택 오버플로
-
프로그램의 실행 중 콜 스택(call stack)이 오버플로해서 프로그램이 강제종료 되는 것 또한 흔히 하는 실수. 대개 재귀 호출의 깊이가 너무 깊어져서 온다.
-
힙에 메모리를 할당하는 STL 컨테이너를 사용하거나 전역변수를 사용한다.
이외에도 많은 방법들이 있다.
4.디버깅
- 프로그래밍 대회에서는 눈으로 디버깅 하는 쪽이 더빠른 경우가 적지 않다.
- 디버거를 사용해도 좋은 예로는 프로그램이 런타임 오류를 내고 종료하는 경우.
- 런타임 오류가 났을 때 언어에서 스택 기록을 출력해 주는 경우라면 괜찮지만, 아닌 경우 디버거를 사용해 프로그램이 어디서 왜 죽는지 간단하게 확인 할 수 있다.
댓글남기기