알고리즘
알고리즘을 공부하면 정말 여러 가지 알고리즘이 있다는 것을 느끼게 된다.
나 또한 최근에 계속 알고리즘을 공부하며 코테 문제를 풀고 있는데 하면 할수록 알고리즘의 본래 목적과 멀어지고 그냥 문제를 푸는 용도로만 쓰고 있었다.
코테 문제를 푸는 것도 중요하지만 그보다 알고리즘을 왜 사용하고, 배워야되는지가 더 중요하다고 생각했다.
알고리즘이란 뭘까?
알고리즘의 사전적 정의를 먼저 보면 아래와 같다.
알고리즘은 어떤 값 또는 값의 집합을 입력으로 하고 어떤 값 또는 값의 집합을 출력으로 하는 명확하게 정의된 계산 절차
사전적 정의를 보면 코딩 테스트에서 사용하는 알고리즘이랑 의미가 같다고 생각할 수 있다.
하지만 잘 생각해보면 어떤 웹 서비스를 개발한다고 했을 때 API 호출을 통해서 어떤 요청이 들어오고 DB에서 적절한 데이터를 결과로 출력해 주는 것 또한 알고리즘 정의와 같다고 할 수 있다.
여기서 알고리즘의 사전적 의미를 두 가지 범위로 나눠보자.
좁은 의미의 알고리즘
좁은 의미의 알고리즘은 명확하게 정의된 계산 문제에 대해서 정렬이나 탐색 등 정의된 계산 절차를 수행하는 것이다.
예를 들면 어떤 문제가 주어지면 특정 알고리즘을 사용해서 결과 값을 출력해주는 코딩 테스트를 생각해 볼 수 있다.
넓은 의미의 알고리즘
넓은 의미의 알고리즘은 도메인 로직의 흐름을 생각해볼 수 있다.
예를 들면 앞서 설명했던 것처럼 어떤 API 호출을 통해서 데이터가 전달되면 백엔드 서버나 DB를 통해서 적절한 처리 과정을 거친 후 결과를 출력하는 것도 하나의 알고리즘이라고 볼 수 있다.
알고리즘을 왜 배워야 할까?
알고리즘의 중요성
첫 번째로 중요한 이유는 자료 구조와 알고리즘의 관계이다.
자료 구조란 말 그대로 데이터들을 어떤 구조로 만들어 놓은 것으로 내가 원하는 데이터를 찾기 위해서는 결국 정렬이나 탐색 등 알고리즘을 사용해야 한다.
두 번째 중요한 이유는 효율적인 프로그램을 작성하기 위해서이다.
프로그램을 개발하는데 100만 건의 데이터에서 특정 데이터를 찾는다고 생각해 보자. 아무 생각 없이 반복문으로 처리를 하면 최악의 경우에 100만 건을 다 찾아봐야 한다. 하지만 탐색 알고리즘을 사용한다면 몇 십 번의 탐색으로 내가 원하는 데이터를 찾을 수 있게 된다.
이처럼 효율적인 프로그램을 작성하기 위해서는 적절한 자료 구조와 알고리즘을 선택하는 것이 중요해진다.
제한적인 자원
개발할 때 사용되는 CPU나 메모리 등 컴퓨터의 자원은 유한하다. 그러므로 제한된 컴퓨터 자원 내에서 효율적인 프로그램을 작성해야 한다.
대규모의 데이터가 들어왔을 때 어떤 알고리즘을 사용하여 최대한 가지고 있는 자원 내에서 처리할 수 있을지 생각해야 한다.
이미 구현되어 있는 라이브러리
세상에는 프로그램을 개발할 때 필요한 기능들이 이미 다 구현되어 있다. 우리가 개발할 때는 라이브러리를 통해서 구현된 기능들을 가져와서 사용하면 된다.
해당 라이브러리도 잘 살펴보면 내부적으로 자료 구조와 알고리즘을 사용하고 있다. 알고리즘에 대해서 잘 알아야지 지금 필요한 라이브러리가 무엇인지 알 수 있고 적용하는데 어려움이 없을 것이다.
이번에 알고리즘을 공부하면서 알고리즘의 중요성을 확실히 깨닫게 되었다.
이때까지는 막연하게 코딩 테스트 준비를 위한 공부라고 생각했었고, 어차피 실제 현업에 들어가면 크게 사용하지 않을 것이라 생각했었다.
하지만 이번 공부를 통해서 내가 사용했던 라이브러리들이 어떠한 자료구조나 알고리즘을 포함하고 있다는 것을 알게 되었고 아직 내가 많이 부족하다고 느꼈다.
앞으로 알고리즘을 공부할 때는 어떤 자료 구조에 사용되고 실제 어떤 기술에 적용되는지 찾아보면서 공부를 해야겠다.
참고 자료
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] - 암호화 (4) | 2024.09.11 |
---|---|
알고리즘 - 완전 탐색 (0) | 2024.06.20 |
알고리즘 - 우선순위 큐 (0) | 2023.12.04 |
알고리즘 - 그리디(Greedy) (0) | 2023.08.16 |
알고리즘 - 이진 탐색(Binary Search) (0) | 2023.08.16 |