컴퓨터에게 일을 시키기 위해서는 컴퓨터가 작동하는 방식과 컴퓨터가 사용하는 언어를 알아야 한다.

컴퓨터가 작동하는 방식은 간단히 말해서 "절차적"이다. 절차를 정하면 그대로 수행하고, 절차를 저장해 두었다가 반복할 수도 있다. 여기서 절차적이라는 말은 자료를 받아서 결과를 내놓는다는 것을 뜻한다. 프로그래밍 방법론에서 나오는 절차적-재귀적이라는 용어와는 조금 다르다.

그러면, 어떤 절차를 만들 수 있을까?

거의 대부분의 프로그래밍 언어는 4가지의 기본적인 기능이 있다.
1. 변수 선언, 관리
2. 사칙연산
3. 조건분기
4. 반복

이 네가지 기능을 조합하면 별걸 다 만들 수 있다. 아이폰도 구글 검색도 이 네가지 기능을 아주 많이 조합해서 만든 것이다.

저 네가지 기능을 어떻게 조합해야 내가 풀고싶은 문제를 해결하라고 시킬까?

그것이 바로 "알고리즘"과 "자료구조"가 된다. 알고리즘은 결국 문제를 해결하기 위한 절차의 집합이다. 1단계 2단계 3단계 ... 를 다 모으고, 그렇게 모인 것이 문제를 반드시 해결할 수 있음을 증명하면 알고리즘이 완성된다.

뒤에 나오는 증명은 전문가에게 남겨둔다고 쳐도, 단계를 어떻게 쪼개야 할까?

일단 가장 중요한건 이 문제를 풀어야 하는 절박함이다. 컴퓨터 문제는 풀 필요가 없으면 풀지 않는 것이 좋다.

주어진 문제를 반드시 풀어야 한다고 할 때, 누구나 이런 생각이 들 것이다. "아...!!!! 이것만 알면 저거 푸는건데!"

바로 그 알고 싶은것을 적는다. 그것이 바로 풀어야 하는 문제의 "가장 마지막 절차"가 된다.

그것을 알았을 때, 그걸 알면 그것으로부터 답을 어떻게 구하는지 적는다.

예를들어, 삼각형에서 어떤 하나의 각x을 알고 싶다고 하자. 그럼 나머지 두 각a, b만 알아낼 수 있으면 두 각의 합을 180에서 빼면 원하는 각도를 알아낼 수 있다.
x = 180-a-b

다음으로, 이제 a와 b를 알아내는 방법을 마찬가지로 적는다. 무엇만 알아내면 그것들을 알아낼 수 있는 것인지. 물론 각각을 따로 적어야 할 수도 있다. 그리고 그 각각에 대해서 또 여러개의 알아내야 하는 세부 사항들로 나누어질 수도 있다. 그러나 각각은 하나의 절차로 이루어져 있다. 다음과 같이 적어보자.

문제P
P는 a, b를 알면 된다.
 소문제A
   a는 a1과 a2를 알면 된다
      소문제A1
      ...
      소문제A2
      ...
   a1과 a2를 알면 a는 간단하게 구할 수 있다.
 
소문제B
   b는 b1과 b2를 알면 된다.
...
a와 b를 알면 P는 간단하게 구할 수 있다.

저렇게 해서 점점 작은 문제로 분해해 나가면 된다.

가장 작은 문제는 앞에서 설명한 4가지 기본 기능을 사용해서 풀 수 있는 수준까지 쪼개야 한다. 문제를 작게 쪼개고 각각의 작은 문제를 절차로 변환하는 것은 한번에 되지 않지만, 많은 연습을 하면 머릿속에 전체적인 구도가 금방 잡히게 된다.


by snowall 2012. 2. 26. 01:07