본문 바로가기

1. 개발자가 될 수 있을까?/개발자 취준 팁

[개발자 취준 팁] 3. 알고리즘 준비(코딩테스트)

제가 서술할 내용은 개인의 경험에서 느낀 지극히 주관적인 정보입니다. 틀린 정보가 있다면 언제든지 알려주시고, 모든 내용을 맹목적으로 수용하지 마시고 참고용으로만 읽어주시길 바랍니다.
 

1단계2단계3단계4단계5단계
전공공부프로젝트 경험알고리즘 공부 심화인턴 경험정규직 입사

처음 회사에 합격하고, 입사를 준비하며 작성하던 글이 지금까지 흘러왔다.
어느새 나는 4년차 개발자이고, 힘든 고비들을 잘 넘기고 업무적인 지식들을 습득하여 이제는 새로운 업무가 주어져도 큰 어려움이 없는 주니어~미드 사이의 개발자가 되었다.
 
연차가 쌓일수록 처음 시작을 국내 탑 IT 기업에서 한 것이 정말 행운이었다는 생각을 하게된다. 어떤 기업에서 커리어를 시작하더라도 실력과 재능이 있으신 분들은 당연히 점점 인정을 받고 대우를 받으며 점점 빛을 발하게 되어있음은 분명하다. 하지만 다만 그 과정에서 몇배의 노력이 필요할 것이다. 열정과 재능이 있음에도 불구하고 좋은 상급자, 좋은 환경을 만나는 운이 따르지 못해 자신이 발휘할 수 있는 재능을 제대로 발휘해보지 못한 채, "나는 재능이 없는걸까? 개발자라는 직업은 원래 이렇게 힘든걸까?"라는 고민과 함께 열정을 잃어가는 케이스들도 보았다.
 
이러한 이유로 나는 신입 개발자를 준비하는 분들에게 최대한 좋은 곳을 갈 수 있도록 충분한 준비를 하여, 용기를 가지고 도전해볼 것을 추천한다. 지원했다가 떨어지면 어쩔 수없지만, 지원해보지도 않고 큰 회사들의 복잡한 채용 프로세스 때문에 지레 겁을 먹고 지원을 하지 않는 일은 정말 없었으면 한다. 
 
잡담은 이 정도로 하고, 개발자 채용 경쟁이 심화되며 더욱 더 알고리즘 공부의 중요성이 높아지고 있는데 나는 어떻게 대비했는지, 많이 받는 질문들을 바탕으로 공유하려고 한다.


 
 

Q. 알고리즘 공부를 어디서부터 시작해야할지 모르겠어요


가장 많이 질문을 받는 부분인데, 당연히 정해진 답은 없을 것이다. 아마 운이 좋게 알고리즘 수업을 들었다면 대충 알고리즘이 무엇인가?에 대한 개념이 있겠지만, 이 조차도 듣지 못한 비전공생이라면 알고리즘 준비를 어떻게 해야할지 막막한 생각부터 든다.
 

아래의 개념들을 알고 있나요?
  • 시뮬레이션과 구현
  • 브루트 포스
  • 그래프와 BFS
  • 다이나믹 프로그래밍
  • 시간복잡도
  • 공간복잡도

알고리즘 대회가 아닌 취업 시에 나오는 알고리즘 문제들을 풀기 위해서는 기본으로 알아야되는 개념들이 있다. 이 개념들을 도구로 문제를 풀게되기 때문에 이 개념들을 모른다면 아무리 문제를 들여다보아도 풀 수가 없다.
위 키워드들에 대해 아예 기본 개념조차 모르겠다면 해당 개념들을 설명하는 동영상 강의들을 먼저 듣는 것을 추천한다. 내가 취준할 당시에는 백준(https://code.plus/course/51)이 굉장히 유명했는데, 요새는 코딩에 관한 인터넷 강의들이 많기 때문에 위 개념들을 키워드로 해당 키워드들이 커버된다면 어떤 영상이든 상관 없을 것 같다.
 

개념은 아는데 문제를 못 풀겠나요?

위에 개념 공부를 마쳤다고 해서 바로 문제를 풀 수 있는 것도 아니다. 개념들을 도구로 사용하여 이리 응용, 저리 응용을 할 줄 알아야하는데 이 부분이 사실 러닝커브가 있는 부분이다. 본인도 마찬가지로 그랬던 시절이 있었다. 이 기간을 극복하기 위한 방법은 단 한가지, 문제를 푸는 것밖에 없다. 하루에 1개 이상 문제를 풀고, 복기하고, 다시 비슷한 유형의 문제들을 풀어가다보면 어떤 문제를 보면 어떤 도구를 사용하여 풀어야할지 감이 오게 된다.
문제를 푸는데 가장 추천하는 사이트는 단연 LeetCode(https://leetcode.com/)이다. 어렵게 생각할 것 없이 리트코드에서 Easy - Medium 문제들을 딱 200문제만 풀면 된다. 리트코드와 국내 코딩테스트 연습 사이트와의 차이점은 아래와 같이 정리할 수 있다.

  • 영어 문제: 영어로 문제가 나오기 때문에 어렵다고 생각할 수 있지만, 여러번 풀다보면 사실 난이도가 높은 영어가 아니라 파악하기는 어렵지 않을 것이다. 실제 국내 회사들 중에서도 영어로 문제가 나오는 코테 사이트를 이용하는 경우도 있기 때문에 그런 상황에 당황하지 않게 미리 준비하기가 좋다.
  • 메소드 구현 방식의 풀이: 채용 코테 사이트들의 형식이 다양한데(예를들어 일부 메소드를 구현하여 입출력만 맞추면 되는 경우, 메인 메소드까지 포함해야되는 방식, 입/출력을 print out 해야하는 경우 등) 모든 방식의 근본이 되는 메소드 구현 방식으로 연습할 수 있다.
  • 실제 MANGA(구 FAANG)의 면접 기출 문제: 실제 면접에서 나오는 문제들에 대한 감을 잡기도 좋기에 추천한다.

 

Q. 혼자는 풀 수 있는데, 알고리즘 면접이 무섭습니다. 어떻게 해야할까요?


사실 실제로 코딩 업무를 할 때에는 IDE의 도움이 있고 계속 Run을 하면서 개발을 하기 때문에 이런 부담을 가질 필요가 없는데, 코딩 면접을 할 때에는 평가를 받는 자리이고 그 평가자가 지켜보고 있다는 부담감 때문에 공포를 가질 수 있을 것 같다.
 
나는 취준을 할 때에 구글을 목표로 했었다. 국내 IT 회사들 채용 시즌이 오기 전에 겁도 없이 구글에 서류부터 접수하고 서류 합격을 덜컥하는 바람에 구글 코딩테스트를 기준으로 코테를 준비하게 되었다. 
구글의 코딩테스트는 악명이 높기로 유명한데, 구글 코테에서는 면접관이 보는 앞에서 바로 설명을 하면서 문제를 풀어야하고 IDE 없이 풀어야하기 때문에 나는 A4용지에다가 연필로 코드를 써가며 문제를 푸는 연습까지 했었다. 이렇게 하면 실제 프로그래밍 랭귀지 때문에 면접에서 버벅일 일은 없다. 이 때 문제를 참고한 책은 코딩인터뷰 완전 분석이라는 책이었다.
 
이처럼 알고리즘 면접을 위한 대비를 하기 위해서는 코연습을 할 때에도 IDE의 도움을 받지 않고, 최대한 처음에 자기가 생각한 로직을 완벽히 코드로써 구현하고, Compile 횟수를 줄여나갈 수 있도록 노력하는게 좋은 것 같다. 이렇게 하게 되면 연습상황일지라도 스스로 실수를 줄여가기 위해 노력하면서 개발을 하기 때문에 구현 상 작은 실수들을 줄일 수 있고, 실제 인터뷰 때에도 스스로 구현에 대한 자신감이 생긴다.
이렇듯 구현에 대한 자신감을 기르기 위해 나는 연습이나 실전 코딩테스트 때나 항상 아래의 순서를 지켰다.

  • 첫째, 수도코드를 작성한다.
  • 둘째, 로직을 구현하면서 수도코드를 주석으로 단다.
  • 셋째, 구현된 로직에서 엣지케이스를 생각하여 방어 코드등을 추가하여 로직을 강화한다.
  • 넷째, 각 수도코드의 단계별로 시간복잡도와 공간복잡도를 따진다.

이러한 순서를 지켜서 알고리즘 테스트를 보게 되면 결과 자체도 좋아지지만, 면접 상황에서는 면접관에게 이 사람은 충분히 고민을 하고 개발을 하는 사람이라는 인상을 줄 수 있다. 
 

Q. 코테를 볼 때 어떤 언어를 사용하면 좋을까요? 추천하는 언어가 있나요?


정말 부차적인 질문이다. 언어가 무엇이냐는 전혀 중요하지 않다. C 계열의 언어를 쓰면 실행 속도가 더 빠르기 때문에 좋다? python을 쓰면 라이브러리가 다양하게 제공되기 때문에 더 쉽다? 다양한 의견들이 있을 수 있는데 그냥 나의 결론은 "나에게 가장 편한 언어를 써라. 없다면 내가 앞으로 많이 써야하는 언어를 써라."이다. 나는 자바를 사용해서 테스트를 보았고, 앞으로도 볼 것이다.
자바가 C계열의 언어보다 당연히 느리지만, 중요한 것은 실행 속도가 아니다. 결국 알고리즘 시험은 효율적인 알고리즘을 짜는 것이 중요하고, 또 그 코드를 짤 때 어떤 점들을 고려해서 짜는지를 보는 것이 중요한 테스트이지, 천하제일 코드 속도 대회가 아니라는 점을 이야기하고 싶다. 


지금까지 내가 주변 사람들에게 많이 받아온 질문들을 정리해보았는데, 사실 알고리즘 공부에 대해서는 많은 말을 할 필요가 없다.
리트코드에서 Easy - Medium 문제를 200문제만 풀어보면 답이 나온다. 다양한 유형의 문제들을 편식하지 않고 200문제를 풀고나면 내가 이제 새로운 문제를 마주했을 때 두려움을 느끼는지 아닌지 판가름이 난다. 그래도 두려움이 남아있다면! 더 풀면 된다. 이정도면 해볼만할것같은데?라는 자신감이 생긴다면 이제 실제 면접으로 가서 부딪히면 된다.
200문제를 푼다는 것이 쉬운 일은 아니지만, 새로운 문제를 마주하더라도 어떤 유형인지 파악해서 자신감있게 풀어내는 미래를 상상해보면 어떨까? 지금 쌓아둔 실력이 신입 시험 뿐 아니라 앞으로의 이직에도 도움이 될 수 있기에 지금 조금 힘들더라도 스스로의 실력을 충분히 갈고 닦는 시간을 가지시기를 추천하고 싶다.
 
알고리즘 시험을 잘 본다고 개발을 잘하는 것은 아니라고 하지만, 시간복잡도와 공간복잡도를 고려한 "효율적인 코드"를 짤 수 있는 개발자와 그냥 "어떻게든 돌아가는 코드"를 짜는 개발자는 분명히 차이가 있다. 알고리즘 공부를 열심히 하면 당연히 "효율적인 코드"를 짤 수 있는 개발자에 가까워지는 길이기에, 잘해서 나쁠 것은 절대 없는 분야가 바로 알고리즘인 것 같다.
 
이제 거의 취준팁에 대한 내용을 정리한 것 같아서, 어떤 내용을 앞으로 써야할지 고민되지만 다음에 또 여유가 있다면 개발자 성장과 관련된 글로 돌아와야겠다.
 
제 글을 읽는 모든 취준생 여러분들 좋은 결과 있으시길 항상 응원합니다!