알고리즘은 만병통치약 #4

by 전익진

다시 효율성


앞서 알고리즘을 위해서는 반드시 하나 이상의 투입과 산출이 필요하다고 이야기했다. 투입이 존재하고 그에 따른 산출이 반드시 나온다는 이야기를 들으면 이제부터 여러분은 효율성에 대해서도 생각해야 한다.

투입과 산출은 곧 효율성을 말한다.

‘그 결과 효과적인가요?’ 혹은 ‘그 결과 효율적인가요?’

이런 이야기 많이 들어봤다. 우리는 효과와 효율의 차이를 정확히 구분할 수 있을까?

일상에서의 쓰임새가 어떻듯 데이터 분석에 있어 효과와 효율은 매우 큰 차이를 보인다.

결론부터 이야기하면 효과는 투입의 존재에 크게 개의치 않는다. 투입이 있으면 그만, 없어도 그만이다.

하지만 효율은 다르다. 반드시 투입이 있어야 한다.

어떤 결과가 투입 없이 나온 것이라면 그건 효과성을 따져야 할 부분이다.

반대로 투입을 통해 결과가 도출되었다면 그건 효율성을 따져야 하는 부분인 것이다.

0041.jpg

효과와 효율에 대한 이해는 대단히 중요한 관점이므로 예를 들어 간략하게 설명해 본다.

어느 공장에서 매일 10명이 투입되어 한 사람당 10개씩 총 100개의 제품을 생산한다고 가정해 보자. 하지만 오늘은 몸이 아픈 2명이 결근하여 8명이 제품을 생산했다. 한 사람당 10개의 제품이 생산하므로 오늘은 총 80개의 제품이 생산되어야 한다. 근데 작업자의 미세한 실수로 15개가 불량이 발생했고 한 사람은 오전 근무만 하고 퇴근하여 3개만 생산했다. 그래서 최종적으로 생산된 제품은 총 73개 문제가 없는 제품은 총 58개가 되었다.

이때 효과성은 58/73로 약 79%가 된다. 생산된 결과만을 기준으로 평가된다.

하지만 효율성은 다르다. 58/80으로 약 73%가 되는 것이다. 투입이 8명이었다면 총생산량이 80개가 되어야 한다는 개념이다.

위 공장의 오늘 생산은 79% 효과적이지만 73%만 효율적인 것이다.

투자한 만큼 손실 없이 거둬들이는 개념이 효율성을 의미한다.

알고리즘, 문제 해결을 위해 수립된 절차는 반드시 효율적이어야 한다는 점을 잊지 말자.

그 절차가 시간적으로든 공간적으로든 투입만큼 결과도 최대한 산출되어야 한다.




세 가지 포인트


정작 알고리즘의 기본적인 이야기를 하느라 무엇을 하면 좋은지에 대한 이야기가 많이 없었다.

그래서 짧게나마 알고리즘 학습을 위한 방법을 설명해 보고자 한다.

다시 한번 강조하지만 알고리즘은 단순히 컴퓨터 분야에서만 필요한 것이 아니다.

알고리즘을 통한 문제 해결 능력은 컴퓨터를 넘어 모든 분야에 필요한 절대적인 가치다.

그러나 죄송스럽게도 알고리즘을 학습하기에는 프로그래밍 언어만큼 좋은 방법이 없는 것도 사실이다.

‘그렇죠…… 결국 프로그래밍 공부하라는 이야기네요……’

아니다. 프로그래밍 언어의 핵심적인 포인트만 뽑아 알고리즘 훈련에 접목해보라고 말하고 싶은 것이다.

어떤 문제를 푸는 절차를 작성할 때 무작정 작성해 보는 것보다 정해진 규칙과 도구를 이용하면 유리할 것이다.

여기서 필요한 부분이 프로그래밍에 보편적으로 등장하는 세 가지 포인트다.

첫째, 데이터 형식의 개념을 공부하기 바란다.

데이터 형식을 확장해서 말하자면 변수의 설정과 매우 밀접하게 관련이 있다.

이는 곧 투입을 의미하는데 투입되는 값을 문자로 할지 숫자로 할지를 결정하는 중요한 포인트가 된다.

0043.jpg

둘째, 연산자를 익혀야 한다.

수학에 기반한 분야인 만큼 기본적인 사칙연산, 논리 연산, 비교 연산 등을 반드시 익혀야 한다.

이렇게 데이터 형식을 파악하고 변수를 설정해서 해당 변수들의 연산이 이루어지도록 조합하였다면 마지막 셋째, 이들 연산되는 변수들을 효과적으로 제어하는 방법을 생각해야 한다.

이 부분, 효과적인 제어가 바로 알고리즘의 시작인 것이다.

그러면 제어가 무엇이냐? 바로 반복적인 수행, 조건에 따른 수행, 에러 발생 시 대응 방안 등등의 고려이다.

우리가 흔히 말하는 IF문, FOR문 등이 바로 이 제어문에 속하는 것이다.

0044.jpg

아마도 이 세 가지 포인트를 이해할 수 있다면 알고리즘 훈련에 많은 도움을 받을 것이다.

물론 시간적 여유와 ‘나도 언젠가는 꼭 프로그래밍을 학습하고 싶었어’라고 오래전부터 생각하고 계셨던 분이라면 주저 말고 한 가지 컴퓨터 언어를 선택해서 공부하면 더없이 훌륭하다.

중요한 점은 앞서 말한 세 가지 포인트를 정확히 이해하면서 공부하기를 부탁드린다.

그러면 내가 배우지 않았던 언어를 받아들일 때 훨씬 수월하게 습득할 수 있다.

프로그래밍 언어의 기본 개념은 기본적으로 앞서 말한 저 세 가지 포인트를 벗어나 구성되지 않는다.

따라서 새로운 컴퓨터 언어를 배울 때 세 가지 포인트에 대해 정확히 알고 있다면 우리는 언어마다 가진 표현 방식만 배우면 되는 것이다.

문제를 해결하는 능력인 알고리즘은 위 세 가지 사항을 벗어나서 이루어지지 않는다.


http://www.yes24.com/Product/Goods/91614222


매거진의 이전글알고리즘은 만병통치약 #3