Ming's blog

코딩과 디버깅에 대하여 본문

수업 & 스터디/알고리즘 개념

코딩과 디버깅에 대하여

H._.ming 2020. 5. 18. 19:32
반응형

1. 좋은 코드를 짜기 위한 원칙

1) 간결한 코드 작성

ex) 전역 변수 사용

2) 코드 재사용

ex) 함수, 클래스 생성

3) 표준 라이브러리 공부

4) 같은 형태로 프로그램 작성

5) 일관적이고 명료한 명명법 사용

6) 자료 정규화하여 저장

7) 코드와 데이터 분리

 

2. 자주 하는 실수

1) 산술 오버플로

- 계산 과정에서 변수의 표현 범위를 벗어나는 값을 사용하는 것

2) 배열 범위 밖 원소에 접근

3) 일관되지 않은 범위 표현 방식 사용

-> 반 열린 구간 사용!

ex) [a,b)

4) off-by-one 오류

- 큰 줄기는 맞지만 하나가 모자라거나 많아서 틀리는 코드의 오류

5) 상수 오타

6) 스택 오버플로

- 사용하는 환경의 스택 허용량에 대해 미리 숙지

7) 다차원 배열 인덱스 순서 바꿔 쓰기

8) 잘못된 비교 함수 작성

9) 최소, 최대 예외 잘못 다루기

10) 연산자 우선순위 잘못 쓰기

11) 너무 느린 입출력 방식 선택

12) 변수 초기화 문제

-> 새 테스트 케이스를 처리할 때마다 변수들을 적절히 초기화하기

 

3. 디버깅과 테스팅

1) 디버깅에 관하여

프로그래밍 대회를 준비하는 경우 디버거 없이 프로그램의 버그를 찾아내는 연습이 필요합니다.

- 작은 입력에 대해 제대로 실행이 되는지 확인

- 단정문 쓰기(단정문 : 주어진 조건이 거짓일 때 오류를 내고 프로그램을 강제 종료시키는 함수 또는 구문)

- 프로그램의 계산 중간 결과를 출력하기

 

단, 프로그램이 런타임 오류를 내고 종료하는 경우 디버거를 사용하는 것이 좋다.

 

2) 테스트에 관하여

프로그래밍 대회에서는 제출 전에 많은 예제를 가지고 테스트해보는 것이 좋다.

- 스캐폴딩 : 다른 코드를 개발할 때 뼈대를 잡기 위해 임시로 사용하는 코드

-> 코드의 정당성을 확인하거나 반례를 찾을 때 유용

 

4. 변수 범위의 이해

1) 산술 오버플로

- 어떤 식의 계산 값이 반환되는 자료형의 표현 가능한 범위를 벗어나는 경우

 

2) 너무 큰 결과

 

3) 너무 큰 중간 값

 

4) 너무 큰 무한대 값

-> 무한대 값들이 서로 더해지거나 곱해지는 경우가 있는지 살펴보기, 이 경우에도 오버플로가 되지 않도록 주의

 

5) 오버플로 피해 가기

-> 더 큰 자료형을 사용하여 해결하기

 

6) 자료형의 프로모션

- 프로모션 : 피연산자의 자료형이 다르거나 자료형의 범위가 너무 작은 경우 같은 자료형으로 변환해서 계산하는 것

- 프로모션 과정시 적용되는 규칙

(1) 정수 + 실수 -> 정수형이 실수형으로

(2) 정수 + 정수 , 실수 + 실수 -> 더 넓은 범위를 갖는 자료형으로

(3) int형 보다 작은 정수 -> int형으로 

(4) 부호 없는 정수형 + 부호 있는 정수형 -> 부호 없는 정수형으로

 

5. 실수 자료형의 이해

1) 실수와 근사 값

- 컴퓨터의 모든 실수 변수는 정확도가 제한된 근사 값을 저장

 

2) 실수 표기 방식 : IEEE 754 표준

(1) 이진수를 실수로 표기

ex) $ 1011.101 = 2^3+2^1+2^0+\frac{1}{2}+\frac{1}{2^3}=11.625 $

(2) 부동 소수점 표기법

- 다양한 수의 표현을 위해 소수점을 적절히 옮겨서 실수를 표현

- 부호 비트 : 양수인지 음수인지

- 지수 비트 : 소수점을 몇 칸 옮겼는지

- 가수 비트 : 소수점을 옮긴 실수의 최상위 X비트

자료형 부호 비트 지수 비트 가수 비트 지수 범위 유효자릿수
32비트 실수형 1 8 23 $ -2^7+2~2^7-1 $ 6
64비트 실수형 1 11 52 $ -2^10+2~2^10-1 $ 15
80비트 실수형 1 15 64 $ -2^14+2~2^14-1 $ 18

(3) 무한대, 비정규 수, NaN 등의 특수한 값이 존재

 

3) 실수 비교하기

(1) 비교할 실수의 크기들에 비례한 오차 한도를 정한다.

- 같다고 판단해야 할 큰 값 두 개를 비교하는 경우

ex) 연산의 결과가 x가 나와야 하는 두 수식을 계산해 a와 b를 얻었을 경우, a=b라는 결론을 내리려면?

|a-b| < 오차 한도

- 다르게 판단해야 하는 작은 값 두 개를 비교하는 경우

ex) x가 나와야 하는 수식과 y가 나와야 하는 수식을 각각 계산해 a와 b를 얻었을 경우, $  a\neq $라는 결론을 내리려면?

|a-b| > 오차 한도

 

(2) 상대 오차를 이용한다.

$ 상대오차 = \frac{|a-b|}{max(|a|,|b|)} $

- 상대오차가 일정 범위 이하면 같은 수로 판정한다.

 

4) 코드의 수치적 안정성 파악하기

- 수치적으로 안정적이다 = 프로그램의 실행 과정에서 발생하는 오차가 더 커지지 않는다

 

5) 실수 연산을 아예 하지 않기

- 실수 연산을 제대로 하는 가장 좋은 방법은 아예 실수 연산을 하지 않는 것입니다.

ex) 곱셈과 나눗셈의 순서 바꾸기

ex) 양변 제곱하기

ex) 실수 좌표를 써야 하는 기하 문제에서 가로 세로로 정수배 늘려 정수 이용하기

반응형

'수업 & 스터디 > 알고리즘 개념' 카테고리의 다른 글

무식하게 풀기(미완)  (0) 2020.05.25
알고리즘의 시간 복잡도 분석  (0) 2020.05.18
Comments