Why sorting algorithm? 🧐

소프트웨어에게 정렬은 어떤 존재일까

  • 소프트웨어는 데이터를 만들어내거나, 저장하거나, 처리하거나, 보여준다. 혹은 이 일련의 행동을 복합적으로 수행한다.
  • 만들어진 데이터를 처리하고 보여주는 예시 중, 우리가 일상생활에서 자주 접할 수 있는 예시는 다음과 같다.
    • 배달의 민족 앱에서 영업점을 거리가 가까운 순으로 나열한다.
    • 네이버 항공권 조회에서 항공권을 가격 순으로 정렬하여 보여준다.
    • 쿠팡에서 보충제 제품들을 리뷰 평점이 높은 순으로 정렬하여 보여준다.
  • 이와 같이, 정렬은 공부할 때는 손이 많이 가고 복잡한 알고리즘처럼 보이지만 사용자에게 있어서 없으면 이상하게 느껴지는 기본적인 기능에 해당한다.
  • 따라서 ‘코딩은 잘하는데, 정렬은 잘 못한다’ 라거나 ‘좋은 소프트웨어를 만들었지만 정렬은 따로 구현하지 않았다’와 같은 말에는 힘이 없다.

소프트웨어가 아닌, 개발자에게 정렬은 어떤 존재일까

  • 정렬을 배우기 보다 더 훨씬 전에, 나는 알고리즘이라는 단어를 생각하면 막연한 논리흐름표가 생각났다. 대전에 처음 갔는가? Y/N
  • 잘 짜여진 논리, 그에 맞게 설정된 데이터 처리가 알고리즘의 전부일 줄 알았지만 막상 마주했던 것들은 다음과 같다.
    • 시간, 공간 복잡도: Big O notation, Worst와 best, average의 차이와 의의
    • 자료구조: 배열, 큐, 스택, 힙, 트리의 구조와 구현
    • 소프트웨어 구조: 재귀적 구조, Divide & Conquer, Random
    • HW 구조: Memory allocation, Segmentation management, Global & Local variable
  • 전공자의 경우 위의 내용들을 잘 익혀두지 않으면 이어지는 전공 강의에서 휘둘리기가 쉽다. 정확히는 내가, 다음과 같은 생각을 하느라 꽤나 긴 적응기를 거쳤다.
    1. 데이터베이스개론을 듣기 전에는 자료구조만 조금 공부하면 되는거 아닌가?
    2. 운영체제나 시스템프로그래밍을 듣기 전에는 C만 조금 해두면 되는거 아닌가? 알고리즘이 그렇게 중요할까?
    3. 알고리즘 강의는 Big O니, 정렬이니 너무 배울게 많고 어렵지만 종강했으니 다행이다.
  • 기초 중의 기초 강의인데, 위의 3번과 같은 생각을 하며 강의를 들었으니 이어지는 중급 과정에서 남들보다 많은 시행착오를 겪는 것은 당연한 결과였다. 나는 정렬만을 어려워했던 것이 아니라, 정렬을 포함한 알고리즘 전부, 혹은 정렬이 포함하고 있는 기본적인 논리와 프로그래밍 언어 구조에 대한 이해력이 절대적으로 부족했던 것이다.
  • 컴퓨터 네트워크 강의에서 IPv6로 socket client, server를 짰고, DB 강의에서 SQLite benchmark function을 튜닝하고 왔지만 유명무실이나 다름없다. 제대로 기초를 학습하지 않았기 때문이다. 이제와서 정렬을 비롯한 알고리즘을 공부하는 것에 대해 스스로 아쉬움을 느끼고 있지만, 다시 공부하기에는 지금이 가장 빠르다. 다시 공부하면서 얼핏 기억나는 것도 있고, 잘 기억이 나지 않는 것도 있을테지만 그럴 때마다 이때 공부해두는 것이 현업에서 어떻게 사용될지 상상하며 동기 부여하고자 한다. 부디 이 포스트를 보는 독자 여러분 중 누군가는 나를 선례로 삼아 아차 싶은 마음으로 지금이라도 알고리즘 공부를 시작했으면 좋겠다.

공부 방법 📝

  • 예전에 수강했던 알고리즘 강의들을 복습한다.
  • PS하면서 부족하다고 느껴지는 영역을 체크하고, 반복적으로 한계를 느끼는 분야는 포스트를 작성하며 공부한다.
  • 현업에서 어떻게 쓰이는지 상상하면서 디테일하게 공부한다.
  • Design 측면 뿐 아니라 Analysis 측면에서도 알고리즘을 바라본다.

Sorting Algorithm

  • 여러 Sorting Algorithm의 원리를 학습하고, 직접 구현해본다.
  • 그 중에서도, Worst case가 n log n인 알고리즘은 더욱 깊게 탐구해 볼 계획이다.