본문으로 바로가기
반응형

요즘은 알고리즘이라는 말이 심심치 않게 등장하곤 합니다. 그런데 막상 "알고리즘"이라는 용어를 사용하기는 하는데... 과연 '알고리즘'의 정확한 뜻은 무엇일까요?

 

이번 글에서는 알고리즘이란 무엇인가에 대해서 알아보고 코딩과의 관계에 대해서 다뤄보도록 하겠습니다.

 

목차

     

    1. 알고리즘이란?

    '알고리즘'이란 단어는 주로 컴퓨터와 관련하여 많이 등장합니다만, 포괄적으로 생각하면 어떤 일을 해결하려는 방법과 절차로 생각할 수 있습니다.

     

    즉, 

     

    어떤 문제를 해결하기 위한 단계적인 절차나 방법을 공식화한 형태로 표현한 것.

     

    으로 생각해 볼 수 있습니다.

     

    [알고리즘 어원]

    페르시아의 유명한 수학자이자 대수학의 아버지라 불리는 알콰리즈미(al Khowarizimi)의 이름에서 비롯되어있다고 알려져 있습니다.

    출처: 위키백과

     

     

    한동안 유튜브 관련 밈이 유행하기도 했는데요,

    오늘도 알 수 없는 유튜브 알고리즘이 나를 이 영상으로 끌고 왔다.

    여기서의 "유튜브 알고리즘"은 결국 유튜브가 "시청자가 많이 볼 법한" 영상을 추천하는 방법을 의미한다고 볼 수 있습니다.

    알고리즘이라는 용어는 꼭 컴퓨터와 관련이 있어야 하는 것은 아닙니다. 사실 넓은 의미에서의 "알고리즘"은 우리 주위에서 쉽게 볼 수 있습니다.

     

    • 목적지까지 효율적으로 가는 길을 찾는 방법
    • 미세먼지에 따라 청정기의 단계를 조절하는 방법
    • 라면을 맛있게 끓이는 방법
    • 아이가 울 때 달래는 방법...

     

     

    다만, 컴퓨터가 등장하면서 알고리즘의 중요성이 더욱 높아지게 되었습니다. 최근에는 대부분 컴퓨터 프로그램 등과 관련하여 사용되는 경우가 많습니다.

     
    반응형

     

    2. 좋은 알고리즘이란?

    그렇다면 좋은 알고리즘이란 무엇일까요? 기본적으로는 주어진 문제를 가장 잘 해결할 수 있는 것이겠죠. 문제를 해결하지 못하는 것은 제대로된 알고리즘이라고 할 수 없겠죠. 

     

    다만, 최근에는 목표 달성을 정량적으로 명확하게 평가하기 애매한 경우도 많은 듯합니다. (추천 알고리즘 등)

     

     

    일단 문제를 해결하는 목적은 달성했다고 가정해보죠. 이 경우 같은 목적을 달성할 수 있는 여러 알고리즘 중 더 좋은 알고리즘은 다음의 두 가지 사항에서 유리한 것이라고 볼 수 있습니다.

    • 속도
    • 리소스(프로세스, 저장공간)

     

    1. 빠르게 문제를 해결한다.

    같은 기능을 수행하는 알고리즘이라면, 이왕이면 빠르게 처리되는 것이 좋겠죠? 예를 들어 목적지까지 길을 찾는 알고리즘을 생각해보면, 더 빠른 시간 안에 처리가 가능한 것이 좋은 알고리즘이라고 할 수 있습니다.

     

    길을 찾는데 1초만에 찾는 것과 1분 만에 찾는 것이 있다면 무엇이 좋은지는 굳이 이야기할 필요조차 없겠죠!

     

    2. 프로세스, 저장 공간을 적게 사용한다.

    주로 컴퓨터를 이용한 알고리즘 구현에 있어서 되도록이면 프로세스(CPU), 저장공간 (메모리, 데이터베이스 등)을 적게 사용하는 것이 좋습니다. 더 많은 자원을 요구한다면 비용 측면에서 낭비가 되는 경우가 많습니다.

     

    리소스의 낭비를 줄이게 되면 그만큼 적은 비용으로 구현이 가능해져서 상대적인 우위성을 가질 수 있습니다. 따라서 좋은 알고리즘을 설계하기 위해서는 효율성을 고려하는 것이 좋습니다.

     

     

    대표적으로 위의 두가지 요소를 만족하는 것이 좋겠지만, 컴퓨터를 이용하여 알고리즘을 실제로 구현하는 코딩을 생각해보면 추가적으로 고려해야 할 사항이 있습니다.

     

    3. 코딩과 알고리즘

    요즘의 알고리즘은 대부분 컴퓨터와 연관된 경우가 많습니다. 알고리즘이 "방법"이라면 이를 실체화하는 도구가 "코딩"이겠죠? 컴퓨터 프로그램은 코딩을 통해 구현된 일종의 알고리즘들의 집합이라고 볼 수 있습니다.

     

    만약, 코딩을 고려한다면 구현 측면에서 한 가지 더 고민해야 될 사항이 있습니다.

     

    • 효율성 vs. 편의성(유연성)

     

    즉, 기본적으로 알고리즘은 가능하면 처리가 빠르고 리소스를 적게 차지하는 것이 좋습니다만, 이를 구현하는 코딩의 복잡도에 따라서 조금 더 생각할 점이 있습니다.

     

    가장 빠르고 리소스를 적게 사용하는 알고리즘이라도 하더라도, 그 구현 방법이 복잡한 경우라면 오히려 좋지 않을 수도 있습니다. 너무 효율성만을 추구하다 보면, 유연성이 떨어질 수도 있습니다.

     

     

    즉, 코드의 해석이 어려워지고 약간의 알고리즘 변경만으로 전체를 다시 코딩해야 하는 경우가 발생할 수 있습니다. 개발자 교체에 따른 개발 기간의 증가를 가져올 수도 있겠네요!

     

    리소스나 속도가 아주 크리티컬 한 요소가 아니라면, 약간의 비효율이 존재하더라도 해석하기 좋고 변경하기 쉬운 -약간은 타이트하지 않은 - 구조의 알고리즘이 오히려 좋은 것이라고 볼 수도 있을 것 같습니다.

     

    상황과 목적에 맞춰서 효율성과 편의성(유연성) 측면에서 균형을 잘 조절하는 것이 중요할 것 같네요.

     

     

    맺음말

    이번 글에서는 알고리즘이란 무엇인가에 대해 알아보았습니다. 그리고 좋은 알고리즘이란 어떤 것인가에 대해서 "개인적인 사견"으로 살펴보았습니다.

     

    요즘은 꼭 개발자가 아니더라도 코딩을 배우려는 사람이 많은데요, 단순한 코더로서의 능력보다는 종합적인 사고를 가지고 알고리즘 설계를 잘 하는 것이 훨씬 더 중요하지 않을까 생각해봅니다.

     

    반응형