알고리즘(Algorithm)이란
문제를 해결하기 위한 절차나 방법.
문제 해결 방법을 정의한 '일련의 단계적 절차'이자 어떠한 문제를 해결하기 위한 '동작들의 모임'이다.
컴퓨터가 따라 할 수 있도록 문제를 해결하는 절차나 방법을 자세히 설명하는 과정이다. 이를 자세히 설명하면 컴퓨터를 활용한 문제 해결 과정에서 주어진 문제를 해결하는 일련의 방법 또는 절차이며, 문제해결 방법을 순서대로, 절차대로 나열한 것이라고 볼 수 있다.
알고리즘의 유래
알고리즘은 9세기 페르시아(이란)의 과학자인 무함마드 이븐 무사 알-콰리즈미(al-Khwarizmi)의 이름을 라틴화한 단어이다. 그는 수학, 천문학, 지리학에 능통했으며, 많은 사람들이 그를 근대 수학의 아버지로 칭한다. 알고리즘(Algorithm)과 대수학(Algebra)이란 단어는 그로부터 유래한다. 그는 9세기 초 '이항과 환산에 의한 계산에 관한 요약'이라는 제목의 수학책을 만들었다. 이 이름을 줄여서 알 자브르(al-jabr)라 했는데 이것이 영어의 Algebra(대수학, 알지브라)란 단어가 되었다. 12세기 그의 책을 번역한 'Algoritmi de numero Indorum'은 'Algoritmi on the numbers of the Indians'란 뜻이다. 여기서 'Algoritmi'이 그의 성을 라틴화한 단어다. 이 단어가 17세기 프랑스에서 Algorithme로 바뀌었고, 영어에서 이를 차용하여 지금의 Algorithm이 되었다.
알고리즘의 조건
- 입력 : 외부에서 제공되는 자료가 0개 이상 존재한다.
- 출력 : 적어도 2개 이상의 서로 다른 결과를 내어야 한다.(즉 모든 입력에 하나의 출력이 나오면 안 됨)
- 명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다.
- 유한성(종결성) : 유한 번의 명령어를 수행 후(유한 시간 내)에 종료한다.
- 효율성 : 모든 과정은 명백하게 실행 가능(검증 가능) 한 것이어야 한다.
이것들을 바탕으로 알고리즘은 어떠한 입력이 있을 때 입력에 따라 명령을 명확하게 실행하고, 그에 따른 결과물을 효과적으로 도출해 낼 수 있다면 알고리즘으로 볼 수 있다.
반대로 명령에 애매함이 있거나 유한한 시간내에서 끝나는 것이 보장되지 않은 경우는 메서드(Method)라고 한다.
좋은 알고리즘의 분석 기준
- 정확성 : 입력에 대해서 유한 시간 내에 올바른 답을 산출하는가를 판단.
- 작업량 : 전체 알고리즘에서 수행되는 가장 중요한 연산들만으로 작업량을 측정.
- 기억 장소 사용량 : 수행에 필요한 저장 공간을 최소한으로 사용했는지 판단.
- 최적성 : 다른 알고리즘보다 더 적은 연산을 수행할 수 있는지 판단.
분석 기준이 모호하지만 대체로 복잡도라는 개념을 많이 사용한다. 복잡도(Complexity)는 알고리즘의 성능을 나타내는 척도인데 시간 복잡도와 공간 복잡도로 나눌 수 있다. 시간 복잡도는 알고리즘의 수행시간을 평가하고, 공간 복잡도는 알고리즘 수행에 필요한 메모리 양을 평가한다. 반도체가 발달함에 따라 공간 복잡도 보단 시간 복잡도를 우선시 하는 추세이다.
알고리즘을 배우는 이유
- 컴퓨팅적 사고 증진 (논리적 체계적 사고)
- 문제 해결을 위한 사고의 확장
- 기업의 인력 판단 목적
배우는 이유가 명확하게 정해진 것은 아니지만 알고리즘을 알고 있는 것과 모르는 것은 차이가 크다. 첫째로 컴퓨터를 이해해야 논리적이고 효율적인 코드 설계가 가능해진다. 알고리즘과 함께 자료구조를 익혀야 하는 것도 이와 같은 이유이다. 둘 째로 상황에 맞는 알고리즘을 응용하여 효율성이 검증된 코드를 작성할 수 있다. 좋은 목수는 특정 상황에 맞는 연장을 꺼내 쓰는 법을 알고있다. 어떤 방법이든 그 상황을 해결할 수는 있겠지만 연장의 사용법을 알고 있다면 좀 더 빠르고 확실하게 작업할 수 있다. 셋 째로 기업에서 인력을 판단하기 위한 목적으로 사용한다. 몇년 전 부터 코딩 테스트는 트렌드가 되었고 이는 문제 해결능력과 더불어 논리적이고 체계적인 사고를 엿볼 수 있다. 그 사람이 주어진 문제 해결을 어떻게 해쳐나가는지 중요한 판단 요소가 될 수 있기 때문이다.
'Thinking > Concept' 카테고리의 다른 글
추상 팩토리 패턴(Abstract Factory Pattern) 이해하기 (0) | 2024.11.14 |
---|---|
팩토리 메소드(Factory Method) 패턴 이해하기 (1) | 2024.11.14 |
개발자를 위한 필수 디자인 패턴 23가지 GoF 패턴 총정리 (0) | 2024.11.13 |
의사 코드(Pseudo Code)(슈도 코드, 가짜 코드)란? (0) | 2023.09.03 |
컴퓨팅적 사고 (Computational Thinking) (0) | 2023.08.29 |