Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[알고리즘 문제 해결 전략] 좋은 코드를 짜기 위한 노력 본문

독서일지

[알고리즘 문제 해결 전략] 좋은 코드를 짜기 위한 노력

_슈프림 2020. 6. 4. 18:31
728x90

https://book.algospot.com/

 

알고리즘 문제 해결 전략

프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략, 구종만 지음, 인사이트, ISBN 978-89-6626-054-6 새 소식 책 소개 <알고리즘 문제 해결 전략>은 새로운 알고리즘 책입니다. 종이에 적힌 의사코드

book.algospot.com

당장 빨리 결과가 실행되는 코드를 작성하는 것 보다, 읽기 쉬운 코드를 작성하는 것이 중요하다. 코드 스타일을 간결하고 일관되게 유지하려는 노력이 필요하다. 아래 나오는 내용은 기본적인 프로그래밍 실력을 쌓을 때 지키면 좋은 규칙들이며, 오랜 시간을 들여 체계적인 구조를 설계할 때 보다는 빠르고 정확하게 간결한 코드를 구현할 때 도움이 될 만한 방법들이다.

 

 

간결한 코드를 작성하기

코드가 짧으면 짧을수록 오타나 버그가 생길 위험이 줄어든다. 눈으로 빠르게 디버깅 하기도 쉬워진다. 사람들은 어느 프로그램이든지 길게 늘어진 코드보다 짧은 코드를 보고싶어한다.

 

짧은 코드를 작성하기 위해서는 어떻게 하면 좋을까?

 

대표적인 예로 전역 변수를 광범위하게 사용하는 방법이 있다. 복잡한 프로그램에서 전역변수를 사용하는 것은 코드의 흐름을 읽기 어려워지기 때문에 당연히 지양하는 것이 좋지만, 코딩테스트나 프로그래밍 대회에서 작성하는 코드는 비교적 한눈에 들어오고 간결한 구조이기 때문에 전역 변수를 쓰는 것이 도움이 될 수 있다.

 

C나 C++을 사용하고 있다면, 매크로를 사용해보는 것도 방법이다. 중복 타이핑이 필요한 과정에서 발생하는 실수를 최소화하고, 코드의 길이를 짧게 만들어준다. 하지만 여러 사람이 보는 코드일 수록 가독성이 떨어질 수 있으니 신중하게 사용해야 한다.

 

 

코드 재사용

같은 코드가 반복된다면, 함수나 클래스로 분리하여 재사용하는 것이 좋다. 이상적인 세계에서는 하나의 함수가 두가지 이상의 기능을 수행하면 안된다. 하지만 처음부터 엄격하게 모든 규칙을 지킬 수는 없으니, 일단 코드를 큼직하게라도 함수로 묶어보자. 이렇게 코드를 모듈화하는 습관을 기른다면 짧은 시간안에 코드를 깔끔하게 작성하고 유지할 수 있게 된다.

 

 

표준 라이브러리 사용하기

학교 수업에서는 큐나 스택과 같은 자료구조, 또는 정렬과 같은 알고리즘을 작성하는 법을 배운다. 하지만 표준 라이브러리에는 이미 검증된 성능으로 편리하게 사용할 수 있는 것들이 많다. 처음부터 모든 것을 구현하는 것은 시간낭비일 수도 있다. 문자열, 동적 배열, 스택, 큐, 리스트, 딕셔너리 등 활용할 수 있는 표준 라이브러리는 적극적으로 활용하자.

 

 

항상 같은 형식 유지하기

그래프의 BFS(너비우선탐색)나, 2차원평면의 좌표를 표현하는 클래스, 두 구간이 겹치는지 확인하는 함수 등

=> 이 함수들은 코딩테스트에서 반복적으로 아주 많이 사용되는 알고리즘이다.

어떤 방법이 좋은 방식인지 검증하기 위해 다른 형태로 코드를 작성해보는 것은 도움이 될 수도 있다. 하지만 매번 다른 코드를 작성하다보면 이들을 검증하는 데에 시간이 소요된다. 한번 검증된 코드는 그대로 유지하여 꾸준히 사용할 필요가 있다.

 

 

네이밍에 주의를 기울이기

모호하지 않은 변수명과 함수명을 사용하는 것은 코딩테스트 뿐만 아니라 실무에서도 아주 중요하다. 표준 라이브러리에서 사용하는 명명 규약을 익히는 것도 좋다. 예를들어, bool형 값을 반환하는 함수를 작성할 때는, 이 함수가 언제 true값을 반환하는지 알 수 있도록 명명하는 것이 좋다. 2차원 평면에서 한 좌표가 한 원 안에 있는지를 판단하는 함수의 이름은 judge보다 isInsideCircle과 같은 이름이 훨씬 직관적이다.

 

 

모든 자료를 정규화하여 저장하기

같은 자료여도 여러가지 방법으로 표현될 수 있음을 주의하자. 유리수 9/6과 3/2는 같은 수이지만 두 숫자의 표현법이 다르다. 이 경우에는 항상 약분하여 값을 저장한다는 규칙을 세울 수 있다. 2차원 평면의 두 직선 사이의 각도는 -30도, 330도, 690도라고 표현할 수도 있다. 이럴 때 각도를 표현하는 방법을 한가지로 정의해 두어야 값을 다루기가 쉽다. 표현법을 하나로 통일하여 정규화하는 과정이 반드시 필요하다.

 

 

코드와 데이터를 분리하기

코드에는 논리적인 과정만 작성하는 것이 좋다.

String getMonthName(int month){
	if (month == 1) return "January";
	if (month == 2) return "February";
	...
	return "December";
}

이런 식의 코드는 실수를 늘려줄 뿐만 아니라, 논리와 상관없는 문자열 데이터들이 나열되어 의미 파악이 어렵게 된다.

 

String[] monthName = {"January", "February", "March",...,"December"};

String getMonthName(int month){
	return monthName[month-1];
}

완벽한 코드는 아니지만, 각 월의 이름 문자열 데이터는 배열로 묶어서 관리하면 함수에는 논리적인 코드만 남길 수 있다. 이런 방식으로 코드를 작성하면 코드의 양을 줄일 수 있고, 따라서 실수도 줄여준다. 데이터는 코드에 저장하는 것 보다 배열과 같은 자료구조에 저장하고, 참조하여 사용하는 것이 훨씬 논리적이다.

반응형
Comments