-
3.3 자주 하는 실수에 관하여 (1)알고리즘 [Study] 2020. 5. 6. 21:25
- 이 블로그 내의 모든 내용은 알고리즘 문제 해결 전략 (저 구동만 출판: 인사이트) 내용을 요약한 것입니다.
- 제가 이해한 대로 정리한 내용이기에 본문의 내용과 상이할 수 있습니다.
프로그래밍에서 아무리 강력한 알고리즘이라도 모든 문제에 사용할 수 있는 것은 아니다.
하지만 코딩 과정은 어떤 문제를 풀 때나 항상 필요하다. 따라서 어떤 의미에서는 코딩 능력이 가장 중요하다고 볼 수 있다. 간결하고 효율적인 프로그램을 작성하는 능력은 프로그래밍 대회에서 얻어 갈 수 있는 가장 큰 소득 중 하나이다.이 장에서는 와 프로그래밍 대회에서 자주 하는 실수들에 대해서 다룬다.
1. 좋은 코드를 짜기 위한 원칙
- 간결한 코드를 작성하기
프로그래밍 대회에서 코드를 작성할 때의 첫 번째 원칙은 가장 간결한 코드를 작성하라는 것입니다.
간결한 코드는 오타나 단순한 버그가 생길 우려가 줄어들고, 디버깅도 쉬워진다.
프로그래밍 대회에서만 적용되는 방법이지만 전역변수를 많이 사용하는 것도 대회에서는 꿀팁이다!
- 적극적으로 코드 재사용하기 (모듈화)
간결한 코드를 작성하기 위한 가장 직접적인 방법은 코드를 모듈화 하는 것이다.
같은 코드가 반복된다면(3번 이상) 항상 해당 코드를 함수로 분리해 재사용한다는 기본 원칙을 만들면 좋습니다.
- 표준 라이브러리 공부하기
프로그래밍 대회에 참가하는 학생들이 가장 자주 저지르는 실수는 큐나 스택과 같은 자료 구조, 혹은 정렬 등의 기초적 알고리즘을 직접 작성하는 것이다.
시간 제한이 있는 프로그래밍 대회에서 모든 코드를 직접 작성하는 것은 대표적인 시간 낭비의 하나이다.
표준 라이브러리는 셀 수 없을 정도로 많이 사용되고 검증되었기 때문에, 메모리 관리나 정당성 증명에 신경 쓸 필요 없이 편하게 사용할 수 있다.
< 문자열, 동적 배열, 스택, 큐, 리스트, 사전 등의 자료구조, 그리고 정렬 등의 표준적인 알고리즘 구현 사용법을 반드시 잘 알아두자!!>
- 항상 같은 형태로 프로그램을 작성하기
프로그래밍 대회에 참가하다 보면 여러 종류의 코드를 반복적으로 짜게 된다.
이분법, 그래프의 너비 우선 탐색 등의 유명한 알고리즘부터, 2차원 평면의 점을 표현하는 자료 구조, 두개의 구간이 서로 겹치는지를 확인하는 함수 등이 좋은 예다.
한 번 검증된 코드를 작성하고 이것만을 꾸준히 사용할 필요가 있다. 그래야 도구가 아니라 문제에 집중할 수 있다.
- 일관적이고 명료한 명명법 사용하기
모호하지 않은 변수명과 함수명을 사용하는 버릇을 들여라
사용하는 언어의 표준 라이브러리에서 사용하는 명명 규약을 익혀라
- 모든 자료를 정규화해서 저장하기
좋은 코드의 또 다른 원칙으로 같은 자료를 두 가지 형태로 저장하지 않는 것이 있다.
예) 유리수를 항상 약분해 기약분수로 표현, x축을 기준으로 -30도, 330도, 690도 등으로 쓰지 않고 하나로 고정
외부에서 문자열을 읽어들이자마자 가능한 UTF-16이나 UTF-8 인코딩으로 변환해야만 문자열을 다루기 훨씬 편해진다.
정규화는 프로그램이 자료를 입력받거나 계산하자마자 곧장 이루어져야한다.
2. 자주 하는 실수
같은 실수를 반복하기보다는 실수에서 배우는 것이 좋고, 그보다 더 좋은 것은 남의 실수로부터 배워 유사한 실수를 저지르지 않는 것입니다. 프로그래밍 대회에 참가한 사람들이 흔히 저지르는 실수 중 대표적인 것들을 소개합니다.
- 산술 오버플로
프로그래밍 대회에서 가장 자주 등장하는 실수는 계산 과정에서 변수의 범위를 벗어나는 값을 사용하는 산술 오버플로입니다. 이것은 복잡한 문제이므로 차후 다루도록 하겠습니다. - 배열 범위 밖 원소에 접근
다음으로 흔하게 등장하는 실수는 배열 범우 밖의 원소에 접근하는 오류입니다.
이런 실수를 예방하는 가장 좋은 방법은 당연하게도 배열 크기를 정할 때 계산을 신중히 하는 것입니다.
0을 시작으로 하는 범위와 1을 시작으로 하는 범위를 혼동하는 것 또한 흔한 실수입니다. - 일관되지 않은 범위 표현 방식 사용하기
배열의 잘못된 위치를 참조하는 오류가 발생하는 큰 원인 중 하나로, 프로그램 내에서 여러가지 범위 표현 방식을 섞어 쓰는 경우가 있다. (열린 구간, 닫힌 구간, 반 열린 구간 등)
대부분의 프로그래밍 언어에서 n개의 원소를 갖는 배열 a의 첫 번째 원소는 a[0]이고 마지막 원소는 a[n-1]인 반 열린구간을 사용한다. 이러한 반열린 구간은 분명한 장점이 있다.
1. 공집합을 만들기 쉬움 = [2,2)로 표현된 반 열린 구간은 2<= i<2 인 모든 i를 포함하므로 공집합이 된다.
2. 연속성 파악에 용이 = 두 구간 [a,b)와 [c,d)가 연속해 있는지 보려면 b=c 혹은 a=d인지만 확인하면 됨
3. 구간의 크기 파악 간결 = [a,b)로 표현된 구간에 포함된 자연수의 수는 b-a - Off-by-one 오류
Off-by-one 오류는 계산의 큰 줄기는 맞지만 하나가 모자라거나 하나가 많아서 틀리는 코드의 오류들을 모두 가리킵니다. 이런 오류를 방지할 수 있는 좋은 방법은 최소 입력이 주어졌을 때 이 코드가 어떻게 동작할지를 되새겨 보면서 프로그램을 짜는 것입니다.
ex) A[1]부터 A[1]까지의 평균을 구할 땐 0이 아니라 1로 나눠야 합니다.
* 흔히 하는 실수들은 양이 많으므로 다음장에 이어서 다루도록 하겠습니다.
'알고리즘 [Study]' 카테고리의 다른 글
프로그래머스 쇠막대기 파이썬 문제풀이 (level2) (0) 2020.06.03 3.5 변수 범위의 이해 ( 산술 오버플로) (0) 2020.05.12 3.3 자주 하는 실수에 관하여 (2) (0) 2020.05.07 알고리즘 문제 해결 전략 정리 (0) 2020.04.29