Programming/Algorithm

1년차 백엔드 개발자가 알고리즘(Algorithm) 공부를 시작하는 이유

Jan92 2022. 1. 1. 23:22

알고리즘(Algorithm)

먼저 프로그래밍 알고리즘(Algorithm)이란?

 

알고리즘은 '어떠한 문제를 해결하기 위한 일련의 절차를 공식화한 형태로 표현한 것'입니다.

 

프로그래밍에서의 알고리즘은 input 값을 통해 output 값을 얻기 위한 계산 과정을 의미하며, 좀 더 자세하게는 컴퓨터가 어떤 문제를 해결하기 위해 사용자가 컴퓨터에게 문제를 어떻게 처리해야 하는지에 대한 방법으로 프로그래밍을 통해 적용시켜주는 것을 이야기합니다.

알고리즘은 프로그래밍을 하는 데 있어서 굉장히 중요한 요소로 작용됩니다. 왜냐하면 어떤 알고리즘을 사용하느냐에 따라서 프로그램이 효율적으로 동작할 수도 있고, 비효율적(느리게)으로 동작할 수도 있기 때문입니다.

 

 

알고리즘의 조건

 

입력 : 알고리즘은 0 또는 그 이상의 외부에서 제공된 자료가 존재해야 합니다.

출력 : 알고리즘은 최소 1개 이상의 결과를 가져야 합니다.

명확성 : 알고리즘의 각 단계는 명확하여 애매함이 없어야 합니다.

유한성 : 알고리즘은 단계들의 유한한 횟수로 거친 후 문제를 해결하고 종료해야 합니다.

효과성 : 알고리즘의 모든 연산들은 사람이 종이와 연필을 이용하여 유한한 시간 안에 정확하게 수행할 수 있을 정도로 충분히 단순해야 합니다.

 

알고리즘은 결국 효율성으로 평가하게 되고, 컴퓨터에서는 시간과 메모리라는 두 자원을 얼마나 소모하는지가 효율성의 중점이 됩니다.

시간 복잡도(Time Complexity), 공간 복잡도(Space Complexity)

 

 

알고리즘의 분류

 

구현 : 재귀적 알고리즘, 연역적 알고리즘, 결정론적 알고리즘, 근사 알고리즘, 양자 알고리즘 등

설계 : 무차별 대입 공격, 분할 정복 알고리즘, 그래프 순회, 분기 한정법, 확률적 알고리즘, 리덕션, 백트래킹 등

최적화 문제 : 선형 검색법, 동적 계획법, 탐욕 알고리즘, 휴리스틱 함수 등

이론적 분야 : 검색 알고리즘, 정렬 알고리즘, 수치 알고리즘, 그래프 알고리즘, 문자열 알고리즘, 암호학적 알고리즘, 기계 학습, 데이터 함축 등

 

 

 

본론, 알고리즘을 공부해야겠다고 생각한 이유

 

먼저 저는 프로그래밍 분야 비전공자로 다른 분야의 직업에서 근무하다가 웹 프로그래밍에 흥미가 생겨 개인적으로 3개월 정도 공부 후 학원에서 4개월 기간의 Java 개발자 양성 과정을 수료하며 개발자로 취직한 소위 말하는 개발의 기초를 제대로 다지지 못하고 속성으로 Spring MVC 기반 사이트를 찍어내는 기술을 습득해서 현장에 투입된 케이스입니다.

(같은 케이스의 다른 분들을 비하하거나 비꼬는 것은 절대로 아닙니다.)



입사 후 9개월간 2개 정도의 프로젝트를 진행하였고, 일 뿐만 아니라 개인적인 공부도 병행하면서 구현된 API를 사용하는 방법이나, 디자인 패턴, 객체 지향 프로그래밍에 대해서도 계속해서 배워가고 있습니다.

 

알고리즘을 공부해야겠다고 마음먹은 가장 큰 이유는 솔직하게 더 좋은 회사에 가기 위해서입니다.

개발자로 근무하며 혼자 공부하며 실력을 쌓아가는 것도 중요하지만 많이 배울 수 있고, 또 잘못된 부분은 피드백받을 수 있는 그런 더 좋은 환경에서 개발하고 싶다는 욕심이 생겼습니다.

그리고 현실적으로 그 '좋은 회사'들은 대부분 코딩 테스트라는 것을 통해 지원자의 PS(Problem Solving) 능력을 알고 싶어 합니다.

(그만큼 중요하기 때문이지 않을까 생각합니다.)

 

 

***

PS (문제 해결 능력 & 구현 능력) 

 

문제 해결 능력,

(= 솔루션을 찾는 능력) 문제를 해결하기 위해서는 문제에 대한 지식이 있어야 하며, 자료구조, 알고리즘, 수학적 사고 등이 문제 해결 능력에 속합니다.

 

구현 능력,

자신이 알고 있는 것을 프로그래밍 언어로 변환하는 것입니다. 문제의 정답을 구하는 방법을 알더라도 실제로 구현할 수 없으면 아무런 의미가 없습니다.

 

 

그리고 다른 이유는 실제로 업무에서도 PS(Problem Solving) 능력의 부족함을 많이 느끼고 있기 때문입니다.

MVC나 REST API에서 어떠한 로직을 구현할 때 어떻게 어떻게 해서 동작은 하도록 만들고는 있지만 구현하는데 발생하는 시간적인 효율성이나 동작하는 코드의 효율성은 전혀 고려되지 않을 정도로 동작만 하는 코드를 구현하고 있습니다.

문제에 접근하고 해결하는 방법에 대한 능력이 부족하면서 단순 응용 기술만 반복해서 구현하기 때문에 생기는 문제라는 생각에 알고리즘 공부를 통한 전체적인 PS 능력을 길러야겠다고 생각하게 되었습니다.

 

 

결론적으로,

알고리즘에 100% 치중해서 공부할 것은 아니며, 기존처럼 Java 언어에 대한 이해와 알고리즘을 함께 공부하며 프로그램 구조에 대한 이해와 응용 능력을 함께 키워 후에 더 좋은 개발 환경에서 일하고 싶다는 것이 목표입니다.

앞으로 블로그의 알고리즘 카테고리를 통해 알고리즘을 처음부터 공부하는 과정과 중요하다고 생각하는 부분을 기록할 계획입니다.

 

 

 

 

< 참고 자료 >

 

실무 개발자에게 알고리즘은 덜 중요할까?

얼마전 페이스북 친구 — 일면식이 있는 것은 아니고 왜 친구가 맺어진지 모르겠지만 — 분이 링크 하나를 공유하면서 ‘개발자 뿐 아니라 컴공과 교수님들도 이 글을 꼭 보시면 좋겠다.’라는

medium.com

2017년도에 작성된 글이지만 알고리즘을 공부하는 것에 대해서 찾아보던 중 여러가지로 생각해볼 수 있게 된 내용이라서 함께 남겨봅니다.