Algorithm & Data Structure (0) - 알고리즘과 자료구조의 중요성

kimseyoung·2023년 1월 7일
0

ComputerScience

목록 보기
1/8

알고리즘의 중요성과 코드 품질

코딩을 처음 배울 때는 우선 올바르게 돌아가게 하는 것이 목표이며 또한 목표여야 한다. 코드가 실제로 동작하는가? 라는 단순한 기준으로 코드를 평가한다.

하지만 경험이 쌓이면서 소프트웨어 공학자는 코드 품질 측면에서 또 다른 계층들과 미묘한 차이를 익혀나가기 시작한다. 같은 일을 해내더라도 두 코드중 한 코드가 더 나을 수 있음을 배운다.

코드 품질은 다양한 척도로 평가 할 수 있다. 한 가지 중요한 척도가 코드 유지 보수성이다. 코드 유지 보수성은 가독성, 조직, 코드 모듈성 같은 측면을 포함한다.

하지만 고품질 코드에는 또 다른 측면이 있는데 바로 코드 효율성 이다. 예를 들어 같은 목표를 달성해도 두 코드중 하나가 더 빠르게 실행될 수 있다.

# print_numbers_version_one.c

int main() {
	int number = 2;
    
    while(number <=100) {
    	if(number % 2 == 0){
        	printf("%d",number);
        } else {
        	number += 1;
        }
    }
    
	return 0;
}


# print_numbers_version_two.c

int main() {
	int number = 2;
    
    while(number <= 100){
    	printf("%d",number);
        
        number += 2;
    }
    
    
    return 0;
}

어느 함수가 더 빨리 실행되는가?

당연히 두번째 버젼일 것이다.(짝수 인지 검증하는 로직 없이 단순 출력)
첫 번째 버전은 루프를 100번 돌고 끝나지만, 두번쨰 버전은 루프를 50회만 실행한다. 따라서 첫 번째 버전이 두번째 버전보다 두 배 더 많으 단계를 거친다. 이렇듯 같은 결과를 보여줘도, 알고리즘에 따라 처리 속도가 다를것이고, 부하도 다를 것이다.

자료 구조(Data Structure)

자료 구조의 중요성을 파악하기 위해서 배열(Array) 와 집합(Set)을 비교해보자.

배열(Array) vs 집합(Set)

배열은 그저 연속된 원소들의 리스트이고, 집합은 중복이 없는 연속된 원소들의 리스트이다.

중복이라는 제한조건이 이 자료구조에 접근하기 위해서 얼마나 많은 단계를 만드는지 알아본다. 두 구조 모두 크기가 5라고 가정한다.

첫 번째, 배열의 경우 맨 앞에 새로운 데이터를 삽입하려면 다음과 같은 절차를 밟는다.

  1. 배열 크기를 + 1 늘린다. (배열의 크기 6)
  2. 빈 부분을 채우기 위해 맨 뒤부터 원소들을 순차적으로 이동시킨다.
    이 과정에서 원소의 갯수만큼 단계가 소요된다. (총 5단계)
  3. 마지막으로 비어있는 배열의 맨 앞에 새로운 원소를 삽입한다.

배열의 경우 맨앞에 데이터를 삽입하는데 총 7단계가 걸렸다. 보통 배열의 크기를 늘리는 과정은 단계로 치지 않아 6단계라고도 한다. (조금 더 이해를 돕기위해 크기를 늘리는 것 까지 추가함)

두 번쨰, 집합의 경우는 중복을 허용하지 않기 때문에 다음과 같은 절차를 따른다.

  1. 먼저 순차적으로 모든 원소에 대해 중복인지 확인한다. (원소의 갯수만큼 단계 소요, 이부분에서 5단계 소요)
  2. 중복이 없음을 확인하면, 배열과 마찬가지로 크기를 +1 늘리고, 원소를 순차적으로 이동시킨다. (추가 1단계 + 이동 5단계 소요)
  3. 마지막으로 맨 앞에 새로운 원소를 삽입한다.

집합의 경우는 중복을 허용하지 않기 때문에 총 5 + 1 + 5 +1 = 12단계가 소요되었다. 이는 구조의 크기가 커지면 커질수록 단계가 늘어날 것이다. 이처럼 자료 구조에 따라 단계가 늘어나고, 줄어든다.

집합은 단계가 많이 걸리니 쓰지 말라는것이 아니다. 알맞은 알고리즘, 알맞은 비즈니스 로직에 필요한 자료 구조를 적절히 사용하는것이 가장 바람직한 방법이다.

다음 글에서는 자료구조와 알고리즘 사이의 연관성에 대해 작성하겠다. 자료구조의 적절한 선정이 얼마나 중요한지 다음 글에서 보일 것이다.

profile
Back-end Developer, DevOps Engineer

0개의 댓글