이 글은 패스트 캠퍼스 알고리즘 강의를 보면서, 개인 경험과 강의내용을 정리하며 적은 글입니다.
이 글은 저와같이 독학자, 취준생 분들에게 알고리즘 강의를 듣기 전 참고용으로 보시면 좋을 듯 합니다.
광고글은 아니며 출처를 분명히 하고 저의 공부 과정을 기록하고자 합니다.
# 코딩 테스트의 기본 원리
기본적인 알고리즘 테스트에서 문제를 푸는 사고 과정은 아래와 같다.
문제 ---------------- 모델링(추상화) ---------------- 절차적 사고 ---------------- 구현
추상화/ 모델링 과정은 문제에서 주제, 맥락, 단어 등 핵심 키워드를 찾아서 무엇을 물어보는지 정확하게 파악하는 과정이다. 다음은 이러한 키워드를 중심으로 어떠한 방향으로 문제를 접근할지 좋은 도구/규칙을 선택해야 한다. 여기서 좋은 도구는 코딩에서는 라이브러리, 함수, 알고리즘, 자료구조 등 다양한 의미로 해석할 수 있다.
절차적 사고 과정은 선택한 도구/규칙을 통해서 답을 유추 할 수 있을지 생각을 해본다. 직접 손으로 코드를 써본다거나, 머리속으로 생각을 해본다거나, 직접 테스트 코드를 작성해서 확인해가며 할 수도 있다. 또한 이러한 행위의 목표는 오류가 날 수 있는 범위를 생각해보는 것이다. 그리고 이 행위를 통해 어떤 도구/규칙이 더 좋을지 생각과 선택하는 과정이다.
구현 과정은 절차적 사고를 직접 코드로 작성하는 부분이다. 절차적 사고와 구분하는 이유는 수학문제를 풀어도 누군가는 풀이는 깔끔하고 누군가는 풀이가 더럽다, 어렵다고 느낀다. 그 부분이라고 보면된다. 왜냐하면 막상 구현을 하더라도 정답이 아닌 상황이 비일비재하다.
# 코딩 테스트가 어려운 이유는 뭘까?
테스트를 보고, 문제를 풀다 보면 이런 생각에 휩싸인다.
'머리가 안 좋아서 못 푸는건가....'
'도저히 이해가 안된다....무슨 말이지'
'사람들은 어떻게 저런 간단한 코드를 생각해내지?'
자꾸만 스스로에게 자괴감을 주며 자책을 하게 된다. 조급함을 생겨서 막무가내로 문제를 푼다.(당연히 풀어지지도 않는다.)
검색을 통해서 어떻게든 방법을 찾아서 풀어낸다. 하지만 막상 테스트 때는 기억이 안난다. 무엇이 잘못 된 것일까.
스스로를 나름 분석 해보았다. 독학자, 취준생인 나에게 주어진 상황은 간단히 보면 아래와 같다.
- 공부 방향을 제시해주고 좋은 풀이라고 해주는 선생님, 사람이 없다.
- 관련된 응용 문제를 잘 정리해서 보여주는 문제가 없다.
- 최신 동향을 뽑아서 요약하고 빠르게 풀 수 있는 방법을 알 수도 없다.
프로그래머스, 백준, 코드시그널 등 대표적인 알고리즘 테스트 사이트에서는 이러한 나의 상황에 맞게 기능들이 구현되어져 있다.
- 풀이를 작성하고 사람들과 공유하여 피드백을 받을 수 있다. 다른 사람의 코드를 보면서 내 코드와 비교해 볼 수 있다.
- 관련된 알고리즘의 비슷한 유형의 문제들을 단계별로 풀 수 있다.
- 취업 시장에서 기업의 코딩 테스트 문제를 공유해준다. 그리고 유투브/구글에서 해당 문제의 풀이를 쉽게 찾아볼 수 있다.
# 공부하기 좋은 환경은 구성되어 있다... 근데 왜 나는 풀지를 못할까?
위의 부정적인 생각은 버려두고, 객관적이게 생각해야 한다. 분명히 원인이 있다.
나의 원인은 아래와 같았다.
- 📚 무작정 문제를 풀었다. 이로 인해 '나는 공부를 열심히 하고 있다'고 위안했다. 단기적 불안감 해소.
- 🥱 코드를 복습하지 않았다. 대충 원리만 파악하고 넘어갔다. 이상하게 생겨나는 자만심.
- ⏰ 푸는 시간을 측정하지 않았다. 풀어내겠다고 끝까지 몇시간이고 붙잡고 있었다. 쓸데없는 황소 고집.
- 🤩 간단한 코드, 다른 사람의 멋진 풀이를 보고 감탄하고, 명확한 이해보다는 암기를 하지만 금방 까먹었다.
- 😵 문제보다는 풀이에 집착했다. 문제 이해 능력 떨어짐.
- 🏓 코딩 테스트 언어에 대한 이해도가 낮다.
- 📊 스스로 테스트를 하지 않았다.
# 어디서부터 무엇을 어떻게 해야 할까?
이전 까지는 문제를 풀면서 나름 복습을 한다고 했지만 조금만 난이도가 상승되면 뇌정지가 와버렸다.
이제는 뭔가 다른 중점으로 공부를 해야한다.
- 처음엔 시간을 맞춰서 여러 유형을 제한 시간내에 푸는 연습을 해보려 했으나, 자유자재로 문자열을 변환한다거나 메서드를 활용 못하고 있다는 상황을 인지하게되었다. ( 어느정도 잘 알고 있다고 생각했지만 ... 주륵..)
그래서! 다시한번 개념을 다지고 꼼꼼히 개념 탑재를 위해 방향을 잡았다.
- 백준 문제 단계별 풀이 꾸준히 진행 - 각 단계별 개념을 정리하면서 암기노트를 작성한다.
- 프로그래머스 문제 lv1~lv5 까지 다 풀기 - 바로 원할히 풀지는 못하겠지만 1레벨 문제부터 공략을 하자.
- 배운 내용 및 터득한 기술 반드시 기록하고 복습 및 암기 시험 진행. - 이 부분이 핵심이다.
정답 풀이는 너무 집착하면서 이해하지말고 대표 풀이 하나 선정하여 사용된 함수의 기능 파악과 문제 분석에 집중하자.
시작 ( 21. 01. 07 )
'Algorithm > Algorithm' 카테고리의 다른 글
Brute_Force Algorithm :: 브루트 포스 알고리즘 (완전탐색) (0) | 2021.01.17 |
---|---|
Floyd_Warshall Algorithm :: 플로이드-와샬 알고리즘 (0) | 2020.10.10 |
Dijkstra Algorithm :: 다익스트라 알고리즘 (최단경로) (6) | 2020.07.26 |