⌨️ 언제 적 코딩 테스트?
이미 한국 패치가 잔뜩 들어간 코딩 테스트에 대해 회의적인 시각이 많아진 현재다.
그러나 그런 시각과 별개로 여전히 코딩 테스트는 유효한 검증 수단이다.
애석하게도 수능에서 5등급을 맞은 학생이 1등급을 맞은 학생에게 수능이 중요한 게 아니야라고 말하는 것만큼 우스운 꼴이 없을 거다.
그리고 잔혹하게도 현실은 1등급을 맞은 학생이 더욱 좋은 대학에 갈 확률이 높다.
이것은 어찌할 수 없는 현실이다.
자 그럼 여러분은 빠르게 현실을 받아들였다고 가정하자.
a) 필요성을 느껴 열심히 준비해 좋은 결과를 낸다.
b) 현재는 여력이 없다 반수나 편입을 노리자.
c) 만족하자
보통 이 세 가지의 경우로 수렴할 것이다. 나의 경우 여러 상황을 고려하여 b를 택했고, 개발 직군으로의 전향 혹은 이직을 위해 코테를 준비하는 법을 많이 물어봐 나 또한 공부할 겸 공유를 하려고 한다.
당연히 절대적인 방법은 아니고 나 또한 뛰어난 실력이 아니므로 가볍게 무시해도 좋다.
이 글은 어느 정도 궤도에 올라 혼자 공부할 수 있는 역량이 되는 분들이 아닌 이제 갓 시작하거나,
혹은 계속해왔다 생각하지만 역량이 발휘되지 않는 분들을 겨냥하여 작성된 글이므로 너그러이 양해 바란다.
✅ 첫 단추부터 확실하게
의외로 많은 분들이 개념을 무시하고 풀이에만 집중한다.
사실 괜찮은 방법이다 풀다 보면 눈이 트이고 문제의 유형이 보이며 풀어 왔던 풀이가 기억이 난다면 말이다.
그러나 나는 확실히 개념을 알아야 한다고 주장한다. 물론 개인적으로 말이다.
극단적인 예를 들어보자
A는 DFS의 개념은 약하지만 문제는 충분히 풀었다.
모 기업의 코테를 보는 데 2항이 DFS 문제가 출제가 되었다.
문제를 읽고 이 문제가 요구하는 내용은 파악했으나, 너무 긴장한 나머지 DFS의 구현을 까먹었다.
⭐️ 보통 한 번 공부할 때 제대로 하지 않으면 이런 곳에서 문제가 발생한다.
여기서부터 모순적이다 DFS라는 걸 알았지만 DFS의 구현 방식이 기억이 안 난다..?
아마 이런 경험을 해본 분들이 적진 않을 것이라 예상된다.
나는 이 개념을 달달 외워서 활용할 줄 알아야 한다고 말하려는 것은 아니다.
그저 논리적으로 이해하고 필요한 순간에 끌어낼 수 있으면 그걸로 충분하다. 그것이 반복된다면 속도도 오를 것이다.
처음 공부하시는 분이라면 꼭 개념과 풀이를 같이 가져가셨으면 좋겠다.
분명 코테 준비를 오래 한 것 같은데 실력 발휘가 안되시는 분들이라면,
지금 당장 공부하던 서적 혹은 강의 등의 목차를 보고 나와 있는 종류들에 대해 내가 온전히 알고 있나?
아니면 그냥 풀어봤다 인지를 다시 한번 체크하길 바란다.
정리
❓ 내가 제대로 알고 있는지 체크하자.
❓ 문제 유형을 보고 파악할 수 있는지, 파악했다면 구현체가 생각 나는 지 확인하자.
✅ 개념의 연결
내가 공부한 개념들이 점으로 존재하다 하나의 선으로 이어지는 쾌감을 맛본 경험이 있는가?
정말 세상에서 내가 제일 천재가 된 거 같은 카타르시스를 준다. 사실 그렇게 특별한 것은 아니지만 말이다...
위의 예시로 DFS로 쭉 가보자
DFS를 구현하기 위해선 몇 가지 요소가 필요할까?
자 한번 같이 고민해 보자 정답은 정해져 있지 않다. 최소한의 조건만을 고려할 것이니 퀄리티의 문제는 눈 감아주었으면 한다.
1. 그래프를 코드로 표현할 수 있어야 한다.
2. 표현된 그래프를 깊이 우선 탐색으로 순회할 수 있어야 한다.
3. 순회할 로직을 구현할 수 있어야 한다.
이 세 가지를 조합하면 아마도 여러분이 자주 보던 DFS의 스탠더드가 나올지 모른다.
DFS를 구현할 때 그래프를 표현 함에 있어 인접행렬로도 가능하고 리스트로도 가능하다
그렇다면 그래프가 어떻게 인접행렬과 리스트로 표현이 가능한 지에 대한 개념이 필요하다
두 번째로는 깊이로 탐색을 해야 하는 데 이는 재귀적으로 혹은 스택 같은 자료구조를 활용해서 해결할 수 있다.
여기서 우리는 어떻게 재귀와 스택같은 걸로 깊이를 탐색하는지에 대한 개념이 필요하다.
마지막으로는 그 재귀함수 혹은 스택으로 순회할 로직을 구현할 구현력만 있으면 된다.
정리
개념을 의사코드로 나타낼 수 있나 확인해 보자
의사코드를 작성했다면 문제풀이에 요구하는 알고리즘의 개념이 반영된 것인지 확인해 보자
✅ 개념의 확장
확장까지 가능하다면
소위 정승제 강사님이 말하는 이뻐죽겠는 학생이 될 수 있다.
즉 수리 영역 1등급을 맞을 가능성, 다시 말해 코테에서는 좋은 퍼포먼스를 낼 가능성이 크다.
지겹겠지만 다시 한번 DFS이다.
자 DFS에서의 확장은 다양하게 있지만 문제적으로, 그리고 알고리즘적으로 발전 2개의 예를 들어보도록 하자
첫 번째로는 문제에서의 발전이다 무슨 말이냐 하면,
순회하는 로직에 +a가 생긴다.
예를 들어 프로그래머스 네트워크 망 문제 같은 것이 있다.
문제의 개요는 그래프를 탐색하여 끊어진 곳이 있으면 count ++ 를 하여 망의 개수를 리턴하는 문제이다.
자 여러분은 끊어진 곳을 어떻게 판단할 것인가? 이것이 개념의 확장이다
여기서 어떻게 확장하느냐에 따라 문제의 풀이 또한 달라질 수 있다.
두 번째는 알고리즘적인 발전이다.
최단 거리를 구하는 것에 많이 사용되는 알고리즘 중 하나인 다익스트라 ( 이 자체만으로도 코테 수준에선 고난도라고 생각함)
여기서부터는 단순히 구현체를 외워서 하기엔 실전에서 많이 헷갈릴 수 있다.
자 여러분은 다익스트라라는 것을 배우지 않았다. 설마 이런 것까지 나오겠어? 하고 말이다.
그러나 문제에선 그래프의 최단 거리를 구하란다. 아차.. 나는 DFS/BFS 밖에 모르는데..
여기서 여러분이 개념을 확장하여 다익스트라 알고리즘을 구현할 수 있다면 진짜 재능러일 것이다..
아직 다익스트라를 공부하지 않은 분이라면 최단 거리라는 키워드를 확장하여 문제를 시도해 보고,
다익스트라를 공부하신 분이라면 다익스트라가 가진 개념을 바탕으로 하여 문제를 시도해보셨으면 한다.
✅ 그래서 어떡하라고?
추상적인 기초 및 개념에 대한 예찬은 이쯤 하고 방법론적으로 다가가보자.
개념에 풀이를 정형화하는 것은 잘못된 방식일 수 있으나,
개념에 스탠더드 한 풀이 하나씩 가지고 있는 것쯤은 괜찮지 않을까..?
1. 강의/서적을 선정한다. 보통 유명한 것들은 이미 다 알려져 있으니 취사선택을 하면 된다.
2. 순서대로 볼 필요는 없다 당기는 거 쉬워 보이는 거 위주로 해도 괜찮다. 하나씩 정복한다.
- 중요한 것은 처음에는 당연히 개념도 잘 안 잡히고 문제도 익숙지 않으므로 못 푸는 게 당연하다
30분 정도 고민하고 답이 안 서면 그냥 풀이를 보자
- 그러나 2~3일 뒤에 한번 일주일 뒤에 한 번 등 2~3번은 풀어서 완전히 익히자 (클래식한 수학 공부법과 일치한다)
3. 거뜬히 풀 수 있는 알고리즘의 가짓수가 늘어난다면 무작위 풀이를 진행하자
- 나의 약점을 알 수 있다.
- 당연하게도 테마를 정하고 풀면 비슷비슷허이 문제 풀기가 쉽다. 하지만 무작위로 주어지는 문제는 대처하기 힘들다
- 프로그래머스에서 무작위 추천 문제를 풀거나 코테 기출을 풀어라
4. 하는 척 말고 제대로
- 이왕 하는 거 여러 번 하면 시간이 아깝다. 한번 할 때 제대로 해두면 두고두고 생각나서 다음번엔 품이 많이 줄으니까 제발 한 번 할 때 제대로 하자..
- 2번만 잘 지켜도 반은 간다..
- 대부분이 알고리즘 공부했다 -> 무슨 알고리즘이 있는지 목차를 훑었다 -> 한 번 풀어본다 -> 안 풀리면 답을 본다 -> 아~ 이해했어 -> 다른 거 푼다 -> 오랜만에 다시 풀려니 기억이 안 난다
- 위와 같은 악순환의 반복이다..
당연히 중요한 것은 단기간에 불가능하다는 것이다. 꾸준히 목표한 퍼포먼스가 나올 때까지 한 번은 해야 한다.
그렇게 하고 나면 향후에는 지원하고 싶은 기업의 코테를 보기 한~두 달 정도 전에만 바짝 해도 충분해지는 체급이 될 것이다 :)
당연히 이 글은 슈퍼 주관적이고 공부법에 대해선 다양한 방법이 있을 것이다.
그러나 내가 정말 정말 하고 싶은 말은 진짜 딱 하나다 '한번 할 때 제대로 하자'
다들 좋은 결과 그리고 원하는 곳에 취직하길 바란다.