[C]알고리즘을 왜 배워야 하는가?

최근 동아리 신입생 교육에 대해서 골머리를 앓던중에 갑자기 이런생각이 들었다.

신입생들에게 과연 알고리즘을 왜 배워야하는지 설명하려면 어떻게 해야할까?

단순히 백과사전처럼 알고리즘이란

어떤 문제의 해결을 위해 컴퓨터가 사용 가능한 정확한 방법을 말한다. 알고리즘은 여러 단계의 유한한 집합으로 구성되는데, 여기서 각 단계는 하나 또는 그 이상의 연산을 필요로 한다.


이라고 설명해줘야할까?

그건 아니라고 본다. 분명히 이해도 못할 뿐더러 필요성도 못느낄것이리라는 생각이 들었다.

하여 고민중에 이런 생각이 들었다.

자 제군들 1부터 100까지 더하는 프로그램을 만들어라.

아마 대부분 다음과 같은 프로그램을 코딩할것이다.

#include <stdio.h>
#include <conio.h>

int main(){
    
     int sum, maxplus;
    
     sum = 0;
    
     maxplus = 100;
    
     for(int i = 1; i <= maxplus; i++)
             sum += i;

     printf("%d\n",sum);
    
     getch();
            
     return 0;
      
}


그러나 알고리즘을 알고 있다거나 조금 머리가 비상한 친구는 다음과 같이 코딩을 할 수도 있을 것이다.


#include <stdio.h>
#include <conio.h>

int main(){
    
     int sum, maxplus;
    
     sum = 0;
    
     maxplus = 100;

    sum = (maxplus+1)*(maxplus/2);
     
     printf("%d\n",sum );
    
     getch();
      
     return 0;
      
}


차이가 느껴지는지 모르겠다.

1부터 100까지 더하는 프로그램을 코딩할때 단순히 100번의 루프를 돌리면 간단하다.

하지만 조금더 생각해본다면 우리가 초등학교 중학교때 배웠던 방법을 응용할 수 있다.

바로 더하려는 최대값(100)의 절반값(50)이 총 최대값 + 1 만큼(101) 반복 된다는 것.

즉 1~100의 합을 구하기 위해서는 아래와 같은 식을 이용할 수 있다는 것이다.

(x/2) * (x + 1) = r
(ex: 50 * 101 = 5050)

지금 당장 이런 루틴에 머리 아프게 이런 식을 써야 하나 라는 생각을 할 수 있지만, 만약 1부터 백만까지의 수를 더해야하는 경우가 발생하다면 단순 루프의 반복보다는 계산식이 좀더 효율적일 것이다.

나는 이것이 알고리즘의 필요성을 한 절반정도 느낄 수 있게 해주리라 믿는다.

사실 알고리즘은 특정한 문제를 해결하기 위한 최적화 된 방법이기도 하지만,

어떤 문제에 부딪쳤을때 해결방법을 제시해주는 역할도 한다고 생각한다.

이 부분에 대해서는 조금 더 생각하여 쉽게 가르칠 수 있는 방법을 연구해야할것 같다.


ps1.
연산 시간에 대해서 테스트를 해봤다.
결과는 다음과 같다.



by 은빛소나기 | 2009/07/27 11:48 | Development | 트랙백 | 덧글(17)

트랙백 주소 : http://kisspay.egloos.com/tb/5023707
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 긁적 at 2009/07/27 14:15
소팅만 해봐도 '알고리즘은 좋은거다!'라는게 느껴지지요 ㅎㅎ
Commented by 은빛소나기 at 2009/07/27 16:06
확실히 소팅만 해봐도 적용할 수 있는 알고리즘의 가지수가 꽤 되니까요;
빅오 배우기 전까지만 해도 뭐가 다른지 잘 몰랐지만요 ㅋ
Commented by highseek at 2009/07/27 14:55
결국은.. 시간복잡도와 공간복잡도의 문제죠 -_-;;
Commented by 은빛소나기 at 2009/07/27 16:07
그게 정답이네요.
근데 나중에는 단순히 알고리즘을 퍼포먼스만을 위한것이 아니라.
어떤 문제가 닥쳤을때 그 문제를 해결하기 위한 것으로 전에 공부한 알고리즘을 떠올릴 수 있게 되더라구요.
즉 미리 공부해두면 나중에 갑자기 문제가 발생했을 때 좀더 원할하게 풀수 있게 말이죠
Commented by 마플 at 2009/07/27 16:33
아주 간단한 방법이 있습니다.
엄청나게 큰 수를 주고( 가령 600851475143 같은... ) 가장 큰 소인수를 구하는 프로그램을 짜오라고 해보시면 됩니다.
왜냐면 기초적인 프로그래밍 능력으로도 해당 문제를 풀 소스를 작성할 수 있으니까요.

그리고 최적화된 알고리즘을 적용한 경우와 직접 짜본 경우의 답이 나오는 시간을 비교해보시면 될것 같습니다.
그 엄청난 시간차이를 보고도 알고리즘을 왜 배워야되냐고 물어볼 수 있을까요?

후자의 경우 답을 보려면 양자컴퓨터가 필요하실겁니다. (...)
Commented by 은빛소나기 at 2009/07/27 16:34
문제는 신입생들이 그만한 프로그램을 짜올 수 있냐가 문제겠지요;
피라미드 하나 만드는데 몇일이나 걸리는걸요 -한숨
Commented by daewonyoon at 2009/07/27 18:13
maxplus 가 홀수라면.
Commented by 은빛소나기 at 2009/07/28 13:32
아 물론 그런 문제가 있긴 하지만 그냥 한 예를 들어준 예제니까요 ^_^
Commented by LorD_Ken at 2009/07/27 18:25
ICPC/ACM문제를 풀어보라고 하면 될듯 하네요.
3학년때 문제를 풀어봤는데, Brute-force로 풀면 10분여가 지나도 풀리지 않고,
적절한 알고리즘을 풀면 1초안에 풀리더군요.

물론, 알고리즘 생각해내는데 1주일이 걸렸습니다 (MFC로 구현하는데는 2시간;)
...ㅠㅠ
Commented by 은빛소나기 at 2009/07/28 13:30
갓 C를 배우기 시작한 신입생들에게 그런걸 시키면 전 맞아 죽습니다 ㅎㅎ
Commented at 2009/07/29 03:05
비공개 덧글입니다.
Commented at 2009/07/29 03:06
비공개 덧글입니다.
Commented by 은빛소나기 at 2009/07/30 09:58
글쎄. 현상보존으로도 벅차 ㅋㅋㅋㅋ
Commented by 로토 at 2009/07/30 18:41
피라미드 만드는데 며칠이라고?


오노.....


파이널 퀘스트였던 학생관리프로그램은 걔들은 얼마만에 해치울지?
Commented by 은빛소나기 at 2009/07/30 19:06
원한 퀄리티를 내온 애들이 아무도 없음
Commented by 123 at 2009/10/24 16:52
현재 알고리즘 과목을 배우고 있는 학생입니다만,

알고리즘 전공서적이 약 400페이지 가량이 돼는데 실질적으로 써먹을

만한 "시간복잡도"와 "공간복잡도"는 채 5페이지도 안됩니다.

그외, 전부 리스트,큐,스택 등이 대부분 이구요.

즉, 알고리즘이란 "시간복잡도"를 주로 배우는 학문이 아니고,

"리스트,스택,큐,힙 등" 을 배우는 과목입니다.

그런데, 실질적으로 기업이나 회사에서 과연 "리스트","스택","큐"를

구현하는지요?

즉, 아이러니컬하게도.

알고리즘 과목이 시간복잡도에 대해 설명을 하고있으면서도

정작 "알고리즘" 자체가 시간복잡도 최악의 경우라는것.

이라고 느낄뿐입니다.

이런거 할시간에 프로젝트를 코드 하나를 더보는게 낫지않을까요

너무나 "형식적"입니다.
Commented by 은빛소나기 at 2009/10/26 17:06
제가 처음 이 글을 쓰게 된 이유가 아주 갓 입학한 신입생들에게 세미나를 하는 과정에서

신입생들이 흥미도, 관심도, 이유도 몰라 하기 때문에 한것입니다.

신입생들에게 단지 코드 몇줄 바꾸는 것만으로 눈에 띄는(물론 가시적인 속도 차이는 아니지만) 결과를 보여주기 위해서 생각한 코드였구요.

저는 이를 통해서 가장 간략하게 이렇것 때문에도 알고리즘을 공부할 이유가 있다 라는걸 보여주고 싶었던 거구요

때로는 123님 말씀처럼 코드 한줄을 더 보는게 나을지 모르겠지만 무엇을 봐야할지도 모르는 신입생들에게 특정 프로젝트 코드를 보고 분석하라는것은 더 "형식적"인게 아닐까요?

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶