알고리즘은 무엇이고 왜 알아야 되며 어떻게 공부해야 되는걸까 ?

알고리즘은 무엇이고 언제 필요하고 어떻게 공부를 해야 될까요?

Posted by JayB Kim on 2017-04-20

알고리즘이란?

안녕하세요?

철학적인 개발자 JayB 입니다.

항상 어떤 새로운 용어나 개념이 나오면 구글링을 하여 정의 부터 알아보는 습관이 있기때문에 먼저 알고리즘이란 무엇인지 검색해보았습니다.

위키피디아 에선 알고리즘을 다음과 같이 정의하고 있네요.

알고리즘이란 어떠한 문제를 해결하기 위한 여러 동작들의 모임이다. 유한성을 가지며, 언젠가는 끝나야 하는 속성을 가지고 있다. 수학과 컴퓨터 과학에서 알고리즘이란 작동이 일어나게 내재하는 단계적 집합이다. 알고리즘은 연산, 데이터 진행 또는 자동화된 추론을 수행한다. 알고리즘이라는 단어는 페르시아의 수학자이던 알콰리즈미의 이름에서 따온 것이다.

우리는 인생을 살아가면서 일상생활에서 다양한 문제들을 접하게 됩니다.

알고리즘은 그러한 문제들을 해결할 때 그 절차를 알기 쉽도록 기술하는 논리적인 절차과정을 의미합니다.

쉽게 예를 들어,

자판기에서 음료수를 뽑아 마시고 싶을때 하는 일련의 과정 또는 절차과정을 생각해보시면 쉽습니다.

  1. 자판기 앞으로 간다

  2. 돈 (지폐나 코인)을 넣는다

  3. 마시고 싶은 음료수를 확인한 뒤 해당 음료가 있는 버튼을 선택한다

  4. 땡그랑! 하고 떨어진 음료수를 꺼낸다

  5. 잔돈이 있다면 잔돈을 받는다.

algorithm_2

이렇게 알고리즘이란건 어떤일을 해결하려 할 때의 절차과정 이라고 생각하시면 됩니다.

개발자로써 알고리즘 공부는 왜 해야하는 걸까?

결론 부터 말씀 드리면,

알고리즘을 잘 알면 좋지만 굳이 많이 알아야 실무에서 개발을 잘할 수 있다고 생각하지 않습니다.

지금까지 개발을 해오면서 알고리즘은 구직할 때 코딩테스트를 보기위해 공부했던 것 같고

알고리즘의 필요성을 느끼진 못했습니다.

지금도 따로 알고리즘 공부를 위해 시간을 할애하진 않습니다.

기본적인 수준의 알고리즘만 알고 있으면 제 경험상 실무에서 (서비스 웹 / 앱 개발) 그닥 필요없습니다.

그럼 이렇게 물어보는 사람도 있겠군요.

알고리즘을 잘 알면 실무에서 도움이 되나?

이건 어떤 프로젝트를 개발하냐에 따라 다른 것 같습니다. 즉, 케이스 바이 케이스 입니다.

애플리케이션에 병목현상이 생겨 이를 개선해야된다거나 특정 로직에 어떤 알고리즘을 사용함으로써

더 나은 속도를 낸다고 했을땐 당연히 많은 알고리즘을 알고 있는게 도움이 됩니다.

허나, 요즘 구글링을 통해 왠만한건 다 나옵니다.

검토하고 적용할 수 있는 능력만 있다면 왠만한건 다 개선할 수 있다고 생각됩니다.

즉, 제가 생각하는 개발에 중요한 요소는 얼마나 알고리즘을 얼마나 많이 알고 있는지가 아니라 문제해결능력개발 요령 입니다.

문제해결능력 이란 문제에 직면했을때 해결하려고 어떻게 접근하는지, 어떤 프로세스를 거쳐 해결을 하는지에 대한 능력을 의미합니다.

프로그래밍을 하다보면 매번 에러에 직면하게되고 그 에러를 찾아내기 위해 머리를 쥐어짜내야 합니다.

한가지의 해결책만 있는게 아니라 여러 해결책중에 어떤게 최선일지에 대한 고민도 해봐야 됩니다.

개발 요령 이란 개발 노하우 (Know How)를 의미합니다.

새로운 언어나 개념을 접했을때 이해가 안될 때 어떻게 하면 쉽게 이해할 수 있을지,

문제에 직면했을때 어떤 노하우로 해결을 할지, 이런 요령을 말하는 겁니다.

개발 요령같은 경우는 하루 아침에 늘릴 수 있는 부분이 아닙니다.

수 많은 시간을 들여 이것저것 삽질을 많이 해보고 해결하는 경험이 필요합니다.

알고리즘에 관해 이야기를 하다가 개발에 중요한 포인트에 대해 말이 새버렸지만

다시 알고리즘를 왜 공부해야하는지로 돌아와서…

복잡한 알고리즘이 필요하거나 성능이 중요시 되는 프로그램을 개발한다면 물론 알고리즘이

중요한 부분을 차지하지만 적어도 지금까지 내가 개발한 안드로이드 앱이나 간단한 웹 개발은

복잡한 알고리즘이 필요하진 않았습니다.

최적화보단 생산성이 중요했습니다.

요새 트렌트를 봤을때 지금 이 시대에는 생산성이 중요한 시대입니다.

점점 더 발전한 언어가 나오고 새로운 플랫폼이 나오면서 개발자는 좀 더 편한 환경에서

빠르게 개발 할 수 있게 되었고 유명한 오픈소스 라이브러리나 프레임워크들은 조금만 찾아보면

금방 나오는걸 알 수 있습니다.

Github Repository에만 가도 정말 좋은 라이브러리리들이 많습니다.

그런걸 검토할 줄 알고 사용할 줄 알아서 개발하고자 하는 어플리케이션에 적용시키는것 또한

개발 요령이라고 생각합니다. 이런 유명한 라이브러리나 프레임워크들은 다년간 업데이트하며

최적화를 시켜왔기 때문에 당연하게도 직접 알고리즘적으로 접근하여 튜닝하는 것보다 백배 낫다고 생각합니다.

그럼에도 불구하고, 왜 알고리즘에 시간을 할애하고 있는 걸까?

다음과 같은 이유에서 입니다.

  1. 최근 로우레벨단 앱을 개발하면서 최적화시켜야 되는 알고리즘을 구축해야 됬고 CPU 성능, 메모리 사용량 등 을 고려해야 됬기 때문이다.

  2. 이번에 구직활동을 시작하면서 여러 기업에서 코딩테스트를 요구하였기 때문이다. (피할 수 없다면 즐겨라!)

  3. 미래에 해외취업을 염두해 두고 있기 때문에 해외기업은 대부분 코딩테스트를 보기 때문이다.

문제를 풀어보면서 느끼는 거지만 난 알고리즘에 재능이 없는 것 같다.

재능이 없다고 포기하면 매번 포기하게 된다.

좀 더 많은 시간과 노력을 기울여야겠다.

한번 보고 두번 보고 세번 보고… 하다 보면 어느새 늘어있지 않을까?

그리고 알고리즘 문제들을 풀다보니 코딩적 사고가 발달 되는걸 느끼게 되었다.

예를 들어,2 중 포문이나 복잡한 구조를 취한 소스코드를 봤을때 좀 더 쉽게 이해할 수 있게 된 것 같다.

다시 본론으로 돌아와서 위에서 설명한 자판기에서 음료수를 뽑는 단순한 과정과 달리 우리가 일상생활에서 접하게 되는 문제들은 단순하게 풀리지 않는다.

예를 들어, 아래와 같은 그림을 보면 알 수 있듯이 집에서 학교까지 가장 빠르게 가려면 어떤 루트를 선택해야 될까?

alrogithm_1

여러 갈림길 놓였을때 어떤 길과 교통수단을 선택하느냐에 따라 소요되는 시간 차이가 달라질 거다.

지금 시대에야 네이버지도나 다음지도 또는 구글지도를 활용하여 쉽게 찾아갈 수 있겠지만 불과 10년 전만 해도 길 찾기가 힘들었던 걸로 기억한다.

학교에 처음 입학해 가는 길이라면 지그재그로 갈 수도 있을테고…

평소에 가던길이 공사중인 길이라면 삥~ 돌아가야 되는 상황이 발생하여 평소보다 더 많은 시간이 걸릴수도 있을테고…

기술은 끊임없이 발전하고 세상은 점점 복잡한 문제들을 해결해야 된다

이렇게 생활 속에서 발견할 수 있는 다양한 문제 상황처럼 프로그램을 개발 할 때에도 알고리즘을 활용하면 목적에 맞게 효율적으로 문제를 해결할 수 있다

즉, 알고리즘은 좋은 알고리즘을 찾고 언제 적용할지 아는 것은 흥미로운 프로그램을 만드는데, 세상의 복잡한 문제들을 해결하는데 도움을 준다.

이번 포스팅에선 알고리즘을 공부하게 된 이유에 대해 말하면서 개발할 때 중요한 포인트가 뭔지에 대해 다뤄봤다.

다음 포스팅에선 알고리즘의 성능 에 대하여 다뤄보도록 하겠다.

알고리즘 공부를 하면서 읽고 참고한 사이트 그리고 알고리즘 문제를 풀고 배울 수 있는 사이트 정리

읽고 참고한 사이트

알고리즘을 배우고 알고리즘 문제를 풀 수 있는 사이트

알고리즘에 관한 다음 포스트