개발자라면 꼭 알고리즘을 공부해야할까?
알고리즘? 그게 정확히 뭐 어떤건데?
알고리즘의 개념 정리
본격적인 알고리즘 공부를 시작하기 전에 먼저 알고리즘이 정확히 무엇인지에 대해 정리해야 한다.
알고리즘(Algorithm)의 사전적 의미
- 어떤 문제를 해결하기 위한 명령어, 방법, 절차의 집합
- 문제를 가장 합리적으로 해결할 수 있는 방안
알고리즘(Algorithm)의 또 다른 의미
- 프로그램에서 올바르게 실행 가능한 명령어들의 유한 집합
- 컴퓨터가 사용자의 데이터를 분석해 가장 최적화된 컨텐츠 제공
넓게 생각해보자면 알고리즘은 문제를 해결하기 위한 가장 합리적인 절차와 방안을 나타낸다. 꼭 컴퓨터에만 적용되는 언어가 아닌 일상에서도 내가 이 문제를 해결할 합리적이고 최적화된 방안이 제시되었다면 알고리즘이 될 수 있는 것이다.
알고리즘의 예시를 들어보면
- 유튜브 알고리즘: 사용자의 클릭 횟수, 시청시간, 키워드 등의 데이터를 분석해 가장 최적화된 컨텐츠를 제공한다.
- AI 알고리즘: 빅스비/시리와 같은 AI가 사용자의 언어 및 데이터를 분석하여 가장 최적화된 방안을 제시한다.
여기서 핵심 키워드는 "최적화", "합리적" 이다. 단순히 문제를 해결하기 위한 모든 절차가 아닌 가장 합리적이고 최적화된 방안을 찾는 것이다. 글로 설명하면 이해가 어려울 수 있으니 유튜브 알고리즘을 예시로 더 자세히 살펴보겠다.
유튜브 알고리즘 예시
해당 알고리즘 순서도는 실제 유튜브 알고리즘에 반영되는 것이 아닌 알고리즘을 이해하기 위한 예시입니다. 참고만 해주시길 바랍니다.
정리하자면 알고리즘의 개념은 '어떠한 문제를 해결하기 위해 가장 효율적이고 합리적인 방안을 찾는 과정 및 해당 방안을 모두 통틀어 이르는 것'이라고 정의 할 수 있다.
알고리즘의 표현 방법
1. 자연어
일상에서 사용하는 언어, 사람들이 의사소통에 사용하는 언어를 통해 표현
2. 순서도
사진/그림을 통해 표현
3. 의사코드
의사코드의 의미: 프로그램을 일상어, 자연어로 표현하여 논리적으로 나타낸 것
예시) 숫자 5를 넣는다.
if(5가 4보다 크다면){
5를 출력한다. }
4. 프로그래밍 언어
c언어, 파이썬 등과 같은 프로그래밍 언어를 통해 표현.
프로그래밍 언어는 크게 고급 언어와 저급 언어로 나뉜다.
- 저급언어 (기계친화적)
기계어: 고수준 명령, CPU에 의존적
어셈블리어: 이진수를 기호로 나타낸 것 (AND, OR등), CPU에 의존적
- 고급언어 (사용자친화적)
절차지향언어: 파이썬, C언어 등/ 반드시 순서대로 처리되는 것, 순차적인 구조
객체지향언어: 자바, C++ 등/ 여러개의 독립적인 객체로 나뉘어 필요할때마다 꺼내쓰는 구조
알고리즘 공부를 위한 포스트이므로 프로그래밍 언어에 관한 내용은 다음에 기회가 있으면 더 자세히 정리하겠습니다.
알고리즘 설계
현재상태와 목표 상태를 명확히 정의하는 것
제어 구조
- 순차 구조
- 선택 구조
- 반복 구조
알고리즘 분석
빅오 표기법(Big O notaion)
시간복잡도
"속도"에 해당하는 알고리즘의 수행시간 분석, 이 알고리즘이 결과에 도달하기에 걸리는 가장 최악의 시간 계산하는 것이다. 계수와 낮은 차수의 항을 제외시키는 방법을 통해 입력 크기를 무한대로(가장 최악의 경우)로 나타낼 경우의 시간 복잡도를 표현하는 것이다.
예를 들어 입력한 데이터의 개수(N)에 따라 알고리즘 처리 횟수가 얼마나 증가하는지 나타낼때 필요한 시간이 최대 10N^3 + 2N^2+3N 이라는 식을 가진다면, 이 알고리즘의 점근적 시간 복잡도는 O(N^3)으로 나타낼 수 있다.
n(데이터 수)가 커질수록 연산 횟수 또한 증가한다.
시간 복잡도 안에 가장 큰 입력범위를 넣었을 때 보통 1억번의 연산 = 1초
O(1) | 상수시간 ->입력 데이터의 개수(n)과 상관없이 처리 시간이 일정 |
↓ 밑으로 갈수록 시간이 오래걸린다. |
O(N) | 1억, 단순 for문 -> 입력 데이터가 증가할 수록 연산 횟수 또한 비례적으로 증가. |
|
O(NlogN) | 5백만, 정렬 알고리즘 | |
O(N^2) | 1만, 이중 for문, 정렬 알고리즘 | |
O(N!) | 11 |
중요한 내용이므로 다음에 기회가 된다면 시간복잡도에 관해서 더 자세히 다루겠습니다.
공간복잡도
알고리즘이 실행될때 사용하는 메모리의 양
참고 자료: https://blog.chulgil.me/algorithm/\
왜 알고리즘을 공부해야할까? ★★★
개발자는 꼭 알고리즘을 공부해야만 하는 걸까?
사실 꼭 알고리즘 공부를 하지 않아도 실행가능한 프로그램은 만들 수 있다. 어떻게 코드를 짜던간에 잘 실행만 된다면 괜찮다면 말이다. 프로그래밍은 단순히 실행만 하는 것이 아닌 보기에 더 편리하고 합리적이고 효율적이여야 한다.
만약 프로그래밍이 실행 결과는 잘 도출하지만 연산 과정이 복잡하고 오래걸리며 하루 종일 돌아가야만 겨우 실행이 되는 프로그래밍이 있다면 누가 사용하고 싶어할까?
프로그램 실행 속도와 실행은 완벽하지만 보기에 코드를 알아보기 힘들고, 불필요한 연산을 반복하는 쓸데없는 코드가 많다면 누가 프로젝트를 같이 하고 싶어할까?
프로그래머들은 내 프로그램을 짤때 단순히 실행만 되는 것이 아닌 훨씬 더 빠른 시간내에 다양한 연산을 할 수 있도록 효율적으로 짜야한다.
따라서 내 코드가 왜 시간이 오래걸리고, 비효율적이고 불필요한 연산을 반복하는지, 어떻게 하면 최적화된 코드를 만들 수 있는지에 대해 알기 위해서 알고리즘 공부를 해야하는 것이다.
만약 아직 코딩을 시작한지 얼마 되지 않아 실행조차 제대로 되지 않는 상황이 아니라면 비효율적인 코드만을 반복하며 알고리즘 공부를 미루고 있다면 당장 하루라도 빨리 시작하는 게 좋을 것 같다.
'알고리즘 자료구조 공부일지' 카테고리의 다른 글
[알고리즘] 유니온 파인드 (Union-Find) 개념과 최적화 기법 (0) | 2024.04.28 |
---|---|
시간복잡도(Time Complexity) (0) | 2024.04.17 |
[알고리즘] 누적합 (prefix sum) (0) | 2023.08.13 |
[알고리즘] 투포인터 (Two Pointer) (0) | 2023.08.12 |
[알고리즘] 재귀함수 (Recursion Function) (0) | 2023.08.08 |