"코딩의 중요성을 간과하지 말라"
▶ 좋은 코드를 짜기 위한 원칙
1. 간결한 코드를 작성하기
코드가 짧으면 짧을수록 오타나 단순한 버그가 생길 우려가 줄어들고, 디버깅도 쉬워진다.
2. 적극적으로 코드 재사용하기
코드 모듈화가 가장 직접적인 방법.
같은 코드가 반복된다면 이들을 함수나 클래스로 분리해 재사용하자.
3. 표준 라이브러리 공부하기
간결한 코드를 작성하기 위한 중요한 원칙 중 하나. 공부를 잘 해두자.
4. 항상 같은 형태로 프로그램을 작성하기
자주 작성하는 알고리즘이나 코드 등에 대해서는 한 번 검증된 코드를 작성하고 이것만을 꾸준히 사용하자.
5. 일관적이고 명료한 명명법 사용하기
모호하지 않은 변수명과 함수명을 사용하는 버릇을 들이고, 사용하는 언어의 표준 라이브러리에서 사용하는 명명 규약을 익히자.
6. 모든 자료를 정규화해서 저장하기
같은 자료를 두 가지 형태로 저장하지 말자(정규화 필수).
7. 코드와 데이터를 분리하기
원하는 문제에 맞춰 데이터로 활용하여 코드의 양을 줄여보자.
▶ 자주 하는 실수
1. 산술 오버플로 (추후에 다룸)
2. 배열 범위 밖 원소에 접근
배열 크기를 정할 때 계산을 신중히 하자.
3. 일관되지 않은 범위 표현 방식 사용하기
프로그램 내에서 여러 가지의 범위 표현 방식을 섞어쓰지말자.
4. Off-by-one 오류
Off-by-one : 계산의 큰 줄기는 맞지만 하나가 모자라거나 하나가 많아서 틀리는 코드의 오류
5. 컴파일러가 잡아주지 못하는 상수 오타
6. 스택 오버플로
콜 스택이 오버플로해서 프로그램이 강제종료. 이는 대개 재귀 호출의 깊이가 너무 깊어져서 옴.
7. 다차원 배열 인덱스 순서 바꿔 쓰기
8. 잘못된 비교 함수 작성
9. 최소, 최대 예외 잘못 다루기
10. 연산자 우선 순위 잘못 쓰기
11. 너무 느린 입출력 방식 선택
12. 변수 초기화 문제
이전 입력에서 사용한 전역 변수 값을 초기화하지 않고 그대로 사용
▶ 디버깅과 테스팅
- 디버깅에 관하여
프로그램이 원하는 바와 다르게 되었을 때, 버그를 찾아내는 것.
프로그래밍 대회에서는 디버거 없이 프로그램의 버그를 찾아내야 함.
디버거 대신 할 수 있는 방법
1. 작은 입력에 대해 제대로 실행되나 확인하기
2. 단정문(assertion)을 쓴다. (단정문이란? 주어진 조건이 거짓일 때 오류를 내고 프로그램을 강제 종료시키는 함수 또는 구문)
3. 프로그램의 계산 중간 결과를 출력한다.
- 테스트에 관하여
스캐폴딩 기법 : 다른 코드를 개발할 때 뼈대를 잡기 위해 임시로 사용하는 코드
이 기법은 코드의 정당성을 확인하거나 반례를 찾는데 유용하게 쓰임.
▶ 변수 범위의 이해
1. 산술 오버플로
수학적/논리적으로는 완전히 정당한 알고리즘도 프로그램으로 구현했을 때는 예상과 다르게 동작하는 경우
2. 너무 큰 결과
변수의 형태에 주의하는 습관을 갖자
3. 너무 큰 중간 값
프로그램의 출력 값은 작지만 중간 과정에서 큰 값을 일시적으로 계산해야 하는 경우
4. 너무 큰 '무한대' 값
존재하지 않음을 나타내는 특수 값을 처리하기 위한 예외 처리를 해줘야 함.
5. 오버플로 피해가기
더 큰 자료형을 쓰자(제일 간단한 방법)
6. 자료형의 프로모션
피연산자의 자료형이 다르거나 자료형의 범위가 너무 작은 경우 컴파일러들은 대개 같은 자료형으로 변환해서 계산한다(=프로모션).
▶ 실수 자료형의 이해
우리가 아는 실수 표현 방식과 컴퓨터가 표현하는 실수 표현 방식은 다르다는 것을 명심
- 실수와 근사 값
정수는 컴퓨터가 모두 정확하게 표현 가능하지만 실수는 다르다.
컴퓨터의 모든 실수 변수는 정확도가 제한된 근사 값을 저장(IEEE 754 표준 참고)
- 실수 비교하기
1. 비교할 실수의 크기들에 비례한 오차 한도를 정한다.
2. 상대 오차를 이용한다.
- 대소 비교
오차로 인해 계산 오류 발생할 수 있으므로 항상 두 값이 같은 경우를 먼저 확인하고 처리해야 함.
- 정확한 사칙연산
- 코드의 수치적 안정성 파악하기
'정리 > 프로그래밍 대회에서 배우는 알고리즘문제 해결 전략' 카테고리의 다른 글
2. 문제 해결 개관 (0) | 2025.02.28 |
---|---|
1. 문제 해결과 프로그래밍 대회 (0) | 2025.02.27 |