알고리즘

알고리즘은 어떤 문제를 해결하거나, 동작을 수행하기 위한 과정을 말합니다. 컴퓨터과학이나 수학에서 사용되곤 합니다.

../../_images/Step2_11.jpg

크리메이커 3D 펜의 소프트웨어에도 알고리즘이 작동합니다.
3D 펜의 소프트웨어를 개발하는데에 있어서, 알고리즘이 만들어지는 과정을 알아봅니다.

먼저 제품의 동작이 어떤 것들이 있는지 확인해야 합니다.
3D 펜이 동작은 어떤 것들이 있을까요? 간단하게 생각해보면 필수적인 동작은 5가지 정도가 있을 것 같습니다.
잠시 생각해보신 뒤, 아래 버튼으로 확인해보세요.
1. 필라멘트 압출(모터 회전)
2. 필라멘트 제거(모터 회전)
3. 예열
4. 냉각
5. 화면 표시

기본적으로 생각나는 것들은 위와 같을 겁니다. 물론 기능중에는 부수적인 것은 포함하지 않았습니다.
하지만 이 것만으로 SW를 작성하기는 약간 무리가 있습니다. 여기에는 조건(입력)이 없습니다.
전원을 켜면 어떤 것들을 해야하는지 알려줄 조건이 필요합니다.
1. A버튼이 눌리면, 필라멘트 압출(모터 회전)
2. B버튼이 눌리면, 필라멘트 제거(모터 회전)
3. C버튼이 눌리면, 예열
4. D버튼이 눌리면, 냉각
5. 정보가 바뀌면, 화면에 표시

입력(조건)을 추가해주었습니다. 5번 동작에서 정보는 여러 값들을 포함합니다. 입력이 없는 상태에서 작동하는 제품은 많지 않습니다.
위의 추가된 조건도 정상적으로 작동하기에 부족함이 있습니다. 어떤 부분이 부족할까요?

여기에서 부족한 부분을 찾는 것은 알고리즘에서 중요합니다. 컴퓨터의 사고방식이 우리와 다르기 때문에 위의 항목만으로 코딩을 작성한다면, 실제 제품의 작동이 제대로 이루어지지 않을 수 있습니다.

../../_images/Push_BTN_S.gif 버튼이 짧게 눌리는 경우

../../_images/Push_BTN_L.gif 버튼이 길게 눌리는 경우

내용이 부족한 부분은 ‘버튼이 눌리면’ 이라는 부분입니다. 한번 누르고 손을 떼면 작동한다는 건지, 꾹 누르고 있어야 작동한다는 건지, 여러 버튼이 같이 눌리면 어떻게 되는지에 대한 설명이 부족합니다.
이런 상세한 내용을 생각해보고 아래 버튼을 눌러 확인해보세요.
1. A버튼만 눌려져 있으면, 필라멘트 압출
(모터 회전, 버튼을 떼면 필라멘트 압출하지 않음)
2. B버튼만 한번 눌려지면, 필라멘트 일정시간 제거
(모터 회전, 버튼을 떼도 일정시간 필라멘트가 제거됨)
3. C버튼만 한번 눌려지면, 예열(버튼을 떼도 예열함)
4. D버튼만 한번 눌려지면, 냉각(버튼을 떼도 냉각함)
5. 정보가 바뀌면, 화면에 표시

버튼을 누르는 방식에 따라 정해진 작동을 하도록 정하였습니다.
이제 입력(조건)부분이 아니라 출력부분도 한번 살펴보겠습니다. 모터의 회전은 방향만 정해주면 큰 어려움이 없습니다만, 예열부분이 문제가 있습니다.
3번 동작에서 C 버튼을 누르게 되면 어떻게 될까요? 문구만 봐서는 예열이 되고 어디에서 멈춘다는 것이 없기 때문에 한계까지 온도가 올라갈 것입니다.
어느정도 온도까지 예열하는지를 정해줘야 합니다.
1. A버튼만 눌려져 있으면, 필라멘트 압출
(모터 정회전, 버튼을 떼면 필라멘트 압출하지 않음)
2. B버튼만 한번 눌려지면, 필라멘트 일정시간 제거
(모터 역회전, 버튼을 떼도 일정시간 필라멘트가 제거됨)
3. C버튼만 한번 눌려지면, 예열을 시작하고, 설정온도에 도달하면 온도를 유지함. (버튼을 떼도 예열함)
4. D버튼만 한번 눌려지면, 냉각(버튼을 떼도 냉각함)
5. 정보가 바뀌면, 화면에 표시

자 이제 각 동작에 대해 입력과 출력을 제대로 수정했으니, 문제될 것이 없을 것만 같습니다.
동작 자체 구현에는 문제가 없습니다만, 실제 사용하는 과정에서 문제가 발생합니다.

A버튼을 누르면 필라멘트를 압출하는 방향으로 모터가 회전하는데, 온도가 충분히 예열되지 않으면 어떻게 될까요? 필라멘트가 밀려지지 않고 모터에 의해 갈려질 것입니다.
B버튼도 마찬가지 입니다. 이 부분을 적용하여 동작을 수정해보면 다음과 같습니다.
1. A버튼만 눌려져 있고 온도가 설정온도에 도달했으면, 필라멘트 압출
(모터 정회전, 버튼을 떼면 필라멘트 압출하지 않음)
2. B버튼만 한번 눌려지고 온도가 설정온도에 도달했으면, 필라멘트 일정시간 제거
(모터 역회전, 버튼을 떼도 일정시간 필라멘트가 제거됨)
3. C버튼만 한번 눌려지면, 예열을 시작하고, 설정온도에 도달하면 온도를 유지함. (버튼을 떼도 예열함)
4. D버튼만 한번 눌려지면, 냉각(버튼을 떼도 냉각함)
5. 정보가 바뀌면, 화면에 표시

이제 동작 구현도 완료되었고, 실제 사용에 있어서 생길 문제점도 개선하였습니다. 이제 실제 사용을 할 수 있는 정도의 동작 알고리즘이 되었습니다.

각각의 동작들을 한번 알고리즘으로 표현해보겠습니다.

1번 동작

../../_images/Step2_23.png

2번 동작

../../_images/Step2_33.png

3번 동작

../../_images/Step2_43.png

4번 동작

../../_images/Step2_52.png

5번 동작

../../_images/Step2_62.png

각각의 동작의 알고리즘은 위와 같습니다. 크게 어려움이 없으실 겁니다.
이 동작들을 작동하는 전체 프로그램의 알고리즘도 다음과 같이 나타낼 수 있습니다.
../../_images/Step2_62.png

위의 알고리즘들을 기본삼아 기초부터 코딩을 시작해보도록 하겠습니다.