1. 알고리즘과 코딩테스트


1-1. 왜 알고리즘을 공부해야할까?

알고리즘 공부는 꽤 이슈가 많은 분야입니다. 특히 다음과 같은 이슈가 있습니다.

알고리즘을 공부하면 개발을 잘할 수 있는가? 알고리즘 대회 우수 수상자는 개발을 잘하는가?

알고리즘 대회를 3~4년 준비하고, 관련된 사람들은 관찰한 결과 어느 정도 상관관계는 있지만 절대적이지는 않습니다. 그렇다면 왜 알고리즘 공부를 해야할까요? 저는 다음과 같은 이유라고 생각합니다.

  • 사고력 : 알고리즘은 결국 문제를 추상화하고 전형적이고 창의적인 풀이를 떠올리는 과정의 연속이기에 사고력이 늡니다.
    • 예외를 찾거나 디버깅 하는 과정도 마찬가지 입니다.
    • 이런 사고력 증진은 다른 개발 코드에서도 도움이 됩니다.
    • 그렇기에 소프트웨어 개발자라면 기본으로 알아야 하는 교양이기도 합니다.
  • 프로그래밍 언어의 이해 : 내장함수나 메서드의 시간 등의 감을 기를 수 있고, 언어의 장점을 활용하는 방법을 배울 수 있습니다.
  • 구현능력 : 생각한 내용을 코드로 짤 수 있는 능력을 기를 수 있습니다.
  • 코딩테스트 : 기업 입사 프로세스 통과

사람마다 목표가 다르기 때문에 이것을 목표로 하라 라고는 이야기할 수 없지만, 알아두면 피가되고 살이 되는 것은 분명합니다.

1-2. 왜 기업들은 코딩테스트라는 절차를 도입했을까?

기업은 결국 효율적인 평가를 원합니다.

개발자의 소양을 보는 방법은 여러가지가 있습니다. 개발자가 진행한 이전 프로젝트(블로그, 깃헙, 논문 등), 기술면접, 평판 등이 있을 수 있습니다. 그렇기 때문에 입사 프로세스에는 이런 모든 것들이 포함되고는 합니다.

하지만 개발자의 개발 실력을 단기간에 평가하기는 매우 어렵습니다. 이런 평가 수단 중 꽤나 의미있다고 보여지는 방법이 코딩테스트 라고 생각합니다.

위에서 말한 구현능력, 사고력 등을 보기에는 적합합니다. 코딩테스트는 결국 다음과 같은 과정이니까요.

주어진 시간 내에 사고력이 필요한 문제를 해결하는 것

짧은 시간 test에 합/불합을 나누는 것은 불합리해보이기도 합니다. 그렇기에 단순하게 코드짜고 정답맞추는 test만이 아니라 다음과 같은 연장선도 있습니다.

  • 풀이 설명 (기술면접)
  • 전수조사 코드 작성과 설명 + 개선된 코드 작성과 설명 (시간복잡도, 공간복잡도 등)

그렇다면 이제 코딩테스트를 위해서는 어떤 것을 준비해야하는지 알아보겠습니다.

1-3. 코딩테스트를 준비하기 전

언어는 보통 C++과 Python을 추천합니다. Java를 쓰셨던 분들이라면 Java도 좋습니다.

C++을 사용하면 좋은 점은 다음과 같습니다.

  • 기존의 많은 문제들은 C++ 사용자를 대상으로 만들어진 문제가 많습니다. (시간제한이나 메모리 제한 등등)
  • 속도가 매우 빠릅니다. (low-level)
  • 참고할 수 있는 코드가 많습니다.

Python을 사용하면 좋은 점은 다음과 같습니다.

  • 간결한 문법
  • 다양한 라이브러리와 함수

대다수의 코드는 Python으로 진행할 예정입니다.

1-4. 이 페이지에서는 무엇을 알아야할까?

이 강의, 이 페이지를 본다고 해서 실력이 당장 늘지는 않습니다. 하지만 빠르게 느는 방법은 확실히 알고 있으니 따라와주시기 바랍니다.

알고리즘 실력(코딩테스트)은 다음과 같이 늘리는 것을 추천합니다.

이론 및 사고력

기술면접의 핵심은 이론을 얼마나 더 잘아는가 입니다. 알고리즘과 자료구조는 추상적인 개념입니다. 왜 사용하고, 어떤 아이디어가 바탕인지 본인만의 정의가 필요합니다.

자료구조와 알고리즘의 정확한 컨셉에 대한 이해, 사용할 수 있는 task, 시간복잡도와 공간복잡도 등을 위주로 보면 좋습니다.

가장 좋은 것은 특정(작은) 데이터셋을 손으로 직접 계산하며 연산해보는 것을 추천합니다. 시간복잡도나 공간복잡도의 증명도 대략적으로 해보는 연습과정이 있어야 합니다.

하지만 가장 좋은 것은 해당 자료구조, 해당 알고리즘의 문제를 풀어봐야 합니다.

대부분 면접에 나오는 알고리즘 및 자료구조는 이 페이지에 담았으니 용어를 위주로 살펴보면 좋습니다.

문제풀이 및 구현

하지만 결국에 코드로 짤 수 있어야 합니다. 구현 실력은 많은 연습 끝에 나옵니다. 다음과 같은 문제들을 위주로 풀어보는 것을 추천합니다.

올림피아드 기출 문제의 경우, 해설이 많이 존재합니다. USACO의 경우에는 공식 해설도 있으니 참고해서 공부하면 좋습니다.

문제를 해결할 때는 다음과 같은 과정을 추천합니다.

  • 문제를 풀때는 반드시 풀이를 보기보다는 고민하는 시간을 정해놓고 푸는 것을 추천합니다. Minimum 30분에서 2시간 정도는 고민하는 시간을 가져야 실력이 늡니다.
  • 풀이는 짧은 풀이와 시간이 적게 걸린 풀이를 위주로 살펴볼 것
  • 문제를 정해가 아닌 풀이로 풀었다고 생각이 들 때는 반드시 정해를 집고 넘어가야 합니다.
  • 외우기 어려운 라이브러리는 과감하게 포기하거나, 반드시 외울 수 있도록 노력하자
    • 라이브러리 의존도가 높은 것은 위험하기에 꼭 필수적인 라이브러리만 외워두고 나머지는 구현하는 것을 추천합니다.

ETC. 알고리즘 조건

  • 입력 : 외부에서 제공되는 자료가 0개 이상 존재한다.
  • 출력 : 적어도 2개 이상의 서로 다른 결과를 내어야 한다.(즉 모든 입력에 하나의 출력이 나오면 안됨)
  • 명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다.
  • 유한성(종결성) : 유한 번의 명령어를 수행 후(유한 시간 내)에 종료한다.
  • 효율성 : 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 한다.