프로그래밍/알고리즘

[알고리즘] 알고리즘(PS)이 개발에 미치는 영향

riroan 2024. 2. 5. 23:15

나는 지금 백엔드(서버) 개발자로 일을 하고 있는데 PS하던 경험이 개발에 알게 모르게 도움이 될 때가 많다. 어떤 것들이 있고 어떤 도움이 되는지 내 생각을 말해보고자 한다.
 

구현능력

솔브드 8대 태그에도 있는 구현은 알고리즘문제를 풀기 위한 기본 소양이다. 실제로 브론즈의 대부분 문제는 구현이 들어있고 알고리즘 문제를 풀기 위한 과정도 구현이다. 이러한 경험을 실제 개발에도 적용하면 비즈니스 로직 구현하는데 도움이 된다고 느꼈다. 다만 아키텍처 설계는 별개이다.
 
그리고 1000문제를 해결했다면 문제당 코드 길이가 평균 50줄이라고 해도 5만 라인을 작성한 것이다. 이 정도라면 코드짜는 자신감과 타이핑속도 등을 얻을 수 있다. (자신감 의외로 중요하다.)
 
구현능력을 테스트하고 싶다면 유효기간이 있는 마일리지 사용 로직을 작성해보자!
 

디버깅

문제를 풀다가 틀렸습니다.가 나오면 보통은 구현 실수나 접근이 잘못된 경우이다. 후자는 제외하고 전자의 경우에는 자신의 코드를 보고 틀린 부분을 찾는다. PS를 하다보면 이런 경험을 많이 하게 되므로 실제 개발에서 에러가 나도 상당히 빠른 속도로 찾을 수 있다. 맞왜틀을 많이 경험했다면 그 당시에는 고통스러워도 나중에 경험치가 쌓여 도움이 될 것이다. 엣지 케이스를 쉽게 찾는건 덤 (즉 예외처리를 더 철저하게 할 수 있다.)
 

테스트코드

개발할 때 필수 코스 중 하나가 테스트코드 작성이다. 문제를 출제한 경험이 있다면 직접적인 도움이 되지만 출제한 경험이 없더라도 문제를 풀기 위해 수많은 테스트케이스를 생각하고는 한다. 이러한 과정을 개발에 그대로 접목시켜 테스트코드를 작성한다면 확실히 더 다양한 케이스를 생각해낼 수 있다.

 

그리고 문제를 출제하는 과정 그 자체로 TDD라고 볼 수 있다. 문제를 출제하기 위해 데이터를 만들고 그 데이터를 통과하는 코드를 작성할텐데 그 과정이 TDD와 매우 유사하기 때문이다.
 
추가로 문제 출제할 때 스트레스 테스트를 해봤다면 그대로 가져와 트래픽 스트레스 테스트로 하면 된다. ㅋㅋ
 

사고력과 문제해결력

PS를 하다보면 머리를 쓰기 때문에 뇌가 말랑말랑해지는 느낌이 든다. 실제로 유연한 생각을 하기 쉽고 비즈니스적인 문제를 해결할 때 빠르고 효율적인 방법으로 해결할 수 있다. 그런 과정에서 자료구조나 알고리즘을 활용할 수 있다면 더 이득이다. 분야에 따라서 수학적인 지식을 사용해야 할 수도 있다.
 
하지만 너무 마이너한 방법을 제시하면 역효과가 나니 주의! (ex 소인수분해를 해야되는데.. -> 폴라드 로!! -> 그게 뭔데 쉽덕아)
 

은근한 알고리즘 지식들

내비게이션에서 쓰이는 다익스트라 알고리즘, 네트워크 용량을 계산하는 (최소 비용) 최대 유량등은 수업 시간에도 배우는 유명한 알고리즘 활용이다. 특히 게임개발자에겐 거의 필수나 다름없다. 게임 몬스터 인공지능, 좌표 이동, 캐릭터 시야 등을 생각하면 계산기하학이 필수로 들어가고 캐릭터 이동할 때 장애물을 피해가려면 또 경로 탐색 알고리즘이 필요하다. (실제로 스타크래프트에는 A*알고리즘이 탑재되어있다.) 게임은 그렇고 서버 개발할 때도 쓰일까?
 
매주 월, 수, 금마다 알림을 설정한 사용자를 찾는다고 하자. 그럼 데이터베이스에 bool로 월~일까지 7개의 컬럼을 만들어야 할까? 비트집합을 사용하면 int 컬럼 1개면 충분하다.

SELECT * FROM ALARM WHERE 월 = True AND 수 = TRUE AND 금 = TRUE

SELECT * FROM ALARM WHERE 알림날짜 = 21   -- (1+4+16)

공간을 획기적으로 절약할 수 있다.
 
또한 금지어를 필터링할 때 아호 코라식 알고리즘을 사용한다고 한다. 이쪽 분야는 순수 알고리즘 외에 딥러닝도 많이 쓰는 듯 하다.
 
그 외에 집합, 맵은 너무 많이 사용하고 우선순위 큐, 덱같은 자료구조도 사용할 일이 많다.
 

코딩테스트

더 이상의 자세한 설명은 생략한다.


위에서 소개한 활용들은 실제로 내가 면접때 알고리즘 경험을 어필할때 부연설명하는 용도로 꺼내는 주제이며 개발할 때 경험한 내용들이기도 하다.
알고리즘은 개발할 때 시간복잡도를 줄여주는 역할을 하지만 그 이상의 최적화(latency 등)가 필요할 때는 컴퓨터 구조, 네트워크, 운영체제 등 더 low한 분야를 알아야 할 수도 있다. 
 
적절한 PS는 지적유희를 넘어 개발에도 도움을 주지만 너무 PS만 과도하게 해서 개발 공부를 하지 않는다면 큰 도움이 되지 않을 수 있다. (내가 그랬다.)