[알고리즘 문제해결전략] 3.코딩과 디버깅에 관하여 - 1

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.디버깅

  • 프로그래밍 대회에서는 눈으로 디버깅 하는 쪽이 더빠른 경우가 적지 않다.
  • 디버거를 사용해도 좋은 예로는 프로그램이 런타임 오류를 내고 종료하는 경우.
    • 런타임 오류가 났을 때 언어에서 스택 기록을 출력해 주는 경우라면 괜찮지만, 아닌 경우 디버거를 사용해 프로그램이 어디서 왜 죽는지 간단하게 확인 할 수 있다.

[출처] 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략(인사이트), 구종만

댓글남기기