알고리즘과 계산 모델에 대한 몇 가지 생각

by 송동훈 Hoon Song

오늘 알고리즘 강의에서 '계산 모델'에 대해 배웠다. 교수님이 이야기하는 것을 들으며 몇 가지 중요한 인사이트를 얻었다. 단순히 코드를 작성하는 것보다 더 근본적인 생각들.


1. 알고리즘의 정의를 다시 생각해보게 되었다. 알고리즘은 단순한 코드가 아니라 '문제를 해결하기 위한 계산 절차'다. 마치 우리가 일상에서 '이 일을 어떻게 해결할까?' 고민하듯, 컴퓨터에게 '이 문제를 어떻게 풀지' 설명하는 방법이다. 알고리즘을 제대로 이해하려면 '계산 모델'을 알아야 한다는 점이 흥미로웠다.


2. RAM(Random Access Machine) 모델은 우리가 배열을 생각할 때 쓰는 방식이다. 메모리의 어느 위치든 바로 접근할 수 있다고 가정한다. 이 모델에서는 위치만 알면 바로 값을 찾을 수 있다. 실제로 많은 사람들이 '데이터를 어디에 저장했는지 정확히 알면 찾기 쉽다'는 원칙으로 일한다. 잘 정리된 책장에서 위치만 알면 책을 바로 찾을 수 있는 것처럼.


3. 포인터 머신(Pointer Machine) 모델은 객체와 참조를 통해 생각하는 방식이다. 마치 사람들 사이의 관계망처럼, A가 B를 알고, B가 C를 알면 A는 B를 통해 C를 찾아갈 수 있다. 링크드인이나 페이스북 같은 인맥 관계와 비슷하다고 생각하니 이해가 쉬웠다. 우리의 인맥도 결국 '포인터'를 따라 확장되는 것이다.


4. 파이썬의 실제 구현에 대한 이야기가 놀라웠다. 파이썬의 'list'가 실제로는 배열이라는 점이 특히 흥미로웠다. 이름과 실제 구현이 다른 경우가 많다. 마치 회사에서 '이 업무는 간단해요'라고 말하지만 실제로는 복잡한 경우와 비슷하다. 겉으로 보이는 이름이나 설명과 실제 작동 방식은 다를 수 있다.


5. 리스트 연산의 시간 복잡도 분석이 실용적이었다. 특히 L.append(x)가 상수 시간에 작동한다는 설명이 인상적이었다. 이것이 '테이블 더블링'이라는 알고리즘 덕분이라는 것도 새로웠다. 우리 일상에서도 '작은 변화를 효율적으로 처리하는 방법'을 찾는 것의 중요성을 느꼈다. 모든 일을 처음부터 다시 하는 게 아니라, 필요한 부분만 효율적으로 추가하는 방식.


6. 파이썬 딕셔너리가 해시 테이블로 구현되어 상수 시간에 동작한다는 설명이 놀라웠다. '높은 확률로' 상수 시간이라는 표현도 재미있었다. 일상에서도 우리는 '대체로' 일이 잘 풀릴 것이라고 기대하지만, 가끔은 예상보다 오래 걸리는 경우가 있다. 알고리즘도 마찬가지인 것 같다.


7. 문서 간 거리 측정 문제는 실용적인 응용을 보여주었다. 구글 검색, 위키피디아 미러 감지, 표절 검사 등이 모두 이 개념을 활용한다니 놀라웠다. 같은 알고리즘적 아이디어가 다양한 분야에 적용될 수 있다는 점이 인상적이었다. 마치 '질문을 잘 하는 사람'이 다양한 상황에서 필요한 정보를 얻어내는 것처럼, 좋은 알고리즘은 여러 문제를 해결할 수 있다.


8. 알고리즘 개선을 통해 실행 시간이 228초에서 0.2초로 줄었다는 사례가 충격적이었다. 단순히 코드를 최적화하는 것만으로도 1,000배의 성능 향상을 얻을 수 있다니! 일상에서도 '어떻게 하느냐'가 '무엇을 하느냐'만큼 중요하다는 것을 다시 한번 깨달았다. 같은 일도 접근 방식에 따라 효율이 크게 달라질 수 있다.


이 강의를 들으며 느낀 것은, 알고리즘이란 단순히 컴퓨터 과학의 영역이 아니라 '효율적으로 문제를 해결하는 사고방식'이라는 점이다. 우리가 일상에서 마주하는 많은 문제들도 결국은 '어떤 방식으로 접근할 것인가'의 문제다. 좋은 알고리즘을 설계하는 것처럼, 삶의 문제들도 효율적으로 해결하는 방법을 찾는 것이 중요하다고 생각한다.


다음 강의는 정렬에 관한 내용이라고 한다. 우리가 어떻게 정보를 체계적으로 배열하느냐에 관한 이야기일 텐데, 이 또한 삶의 많은 영역에 적용될 수 있는 인사이트를 줄 것 같다. 알고리즘의 세계가 점점 더 흥미롭게 느껴진다.

keyword
일요일 연재
이전 01화알고리즘의 효율성이 중요한 진짜 이유