알고리즘 학습을 위한 체계적인 훈련법

신상현·2020년 12월 20일
0

매 기수마다 구현력에 대한 결핍으로 질문을 하시는 분들이 참 많다.
그래서 부족한 나의 고해성사(?)를 통한 학습법을 공유해봤드앙
(Notion 문서에서 마크다운으로 불러와서 깨지는 부분도 있습니다!)

1. 구현력에 대한 고민

🤔 고민의 시작 🤔

알고리즘을 처음 접하고 과제와 같은 문제들을 해결하다보면
자연스럽게 구현력에 대한 고민들이 들기 시작하는데요!

이 글을 읽고 계시는 수강생 여러분들께서도 아래와 같은 고민을 하고 계실거라 생각합니다!

💭 했던 고민들 💭

"배운 것은 열심히 노력해서 다 이해했는데, 뭔가 문제는 안 풀리고...
그렇다고 아예 모르는건 아닌 것 같은데... "

"해설을 보면 처음엔 잘 모르겠어도 코드를 보다보면 이해가 가지만,
잘 생각해보면 내가 문제를 이런식으로 접근할 수 있을까 ...? "

"나도 이렇게 문제를 접근하고 실타래를 하나씩 풀어낼 수 있을까 ? "

" 남이 짠 코드를 보면서 이해하고,
그거랑 비슷한거는 뭐 어찌어찌하겠는데,
무에서 유를 창조하는게 너무 힘들다 "

저 또한 정말로 이런 고민들을 많이했습니다!

그리고 해결하기위해서 여러방면으로 시도했었습니다.

제가 시도한 방법들을 소개해보고자 합니다!

2. 구현을 위해 훈련한 과정

🧘 들어가기전에 가져야할 마음가짐 🧘

  • 알고리즘을 처음 접하면 누구나 겪는 증상(?)이니까 기죽지 말기!
  • 이건 삽질이 아니다! 라고 마인드 세팅하기!
  • 다 모두 좋은 밑거름이다!! 라고 마인드 또 세팅하기!

📚 훈련한 과정들 📚

1. 자료구조 & 알고리즘에 대한 개념정리

  • 이미 자료구조에 대한 개념을 한 번 학습한 상태였었고, 기본적인 set, get, add, delete, update 와 같은 해당 자료구조에 맞는 함수들을 구현 할 수 있었던 상태였었습니다.
  • 하지만 어떠한 알고리즘 문제를 해결할 때 "왜 이 자료구조를 선택하지?" 에 대해서 제 스스로 답하지 못하는 것을 발견했습니다.
  • 그래서 자료구조에 대한 전체적인 특징과 장단점을 다시 한 번 공부했습니다. 앞서 언급했던 해당 자료구조의 데이터를 조작하는 함수들 또한 무조건 적으로 암기하는게 아니라 특징과 장단점과 최대한 엮어서 다시 봤습니다.
  • 예를 들어서 ArrayLinkedList를 함수를 통해 다룰 순 있었지만, 어떠한 기준으로 사용하는 때가 다른지 생각해봤습니다.
  • 즉, 전체적인 자료구조의 숲을 보는 훈련을 했습니다.

2. 알고리즘 문제를 이해하기(?)

  • 이후에 다시 생각해봤습니다.

" 왜 나는 번뜩이게 아이디어가 짠! 생각이 안 나지 ??? "

  • 그래서 구현 아이디어를 일관적이게 떠올리게 하기위해
    구조화를 시키는 훈련을 했습니다.

"A라는 데이터를 잘 조작해서
조건들(1, 2, 3 ...)을 갖고
B라는 행위를 통해
C라는 결과를 구하고 싶은데 한 번 해보시죠!"

  • 라는 문장으로 알고리즘 문제를 정리를 했습니다.

  • < 정리 방법 >

    1. 자료구조 정하기

    A라는 데이터 구조의 특성을 파악하고 어떤 자료구조를 이용하여 저장해둘지 1번 훈련을 바탕으로 결정했습니다.

    2. 패턴 파악하기

    B라는 행위의 규칙성 혹은 패턴등을 파악해봤습니다.
    잘모르겠으면 짧게는 예시를 3개, 많이 하면 10개 까지
    손으로 쓰거나, 기록해보면서 파악했습니다.

    3. 파악한 패턴 코드로 구현하기

    파악한 B 행위의 패턴을 코드로 만드는 훈련을 했습니다.
    결국 if 조건문과 for,while의 반복문 조합으로 행위는 이루어지게 되어있다고 생각하면서 훈련했습니다.
    처음부터 좋은 코드로 짜면 좋겠지만, 저는 "일단 구현한다"를 목표로 만들었습니다.

    4. 리팩토링 및 가독성 고려하기

    위의 3단계의 과정을 거치면 알고리즘 문제는 해결된 상태가 됩니다.
    이후에 최적화를 위한 리팩토링을 시작합니다

    1. 최대한 중복성을 제거하고
    1. 코드의 가독성도 고려

    두 가지를 생각해보면서 리팩토링을 해봅니다!
    혼자서 하는 코드 리뷰? 과정이라고 생각하시면 됩니다!🤣
    누군가와 코드리뷰를 같이 하는 것도 좋은 방법입니다!

3. 2번 훈련의 2단계가 막히는 경우

  • 계속 열심히 고민하는데도 도저히 안되는 경우 길게는 3시간까지 고민해보고 그냥 해설을 봤습니다. 이미 충분히 고민했으니까요!

  • 내가 구현이 막혔던 특정 부분을 기록해두고, 해설 답안에는 어떤 식으로 해당 로직을 풀어갔는지에 대해서 고민했습니다.

  • 해당 로직이 이해가 되었다면, 중간에 답을 보지않고 해당 로직을 바탕으로 처음부터 다시 코드를 작성했습니다.

  • 만약, 위의 과정에서 해설의 로직이 완전히 숙지가 되지 않았다면 분명히 막힙니다.
    막히는 부분을 해결하기위해 30분 정도 해결의 시간(?)을 갖습니다.
    1. 풀리면 쭉쭉 풀어냅니다! 그리고 마지막에 막혔던 부분의 로직을 다시 한 번 검토합니다!
    2. 안되면 다시 돌아와서 해설의 로직을 이해합니다.

  • 이러한 방식을 반복하여 해설의 로직을 바탕으로 한 알고리즘 답안을 작성합니다.

  • 내가 풀이하려 했던 방식과 해설 바탕의 답안을 다시 리뷰해봅니다.

  • 특정 구현보다는 이런 류의 조건을 어떻게 처리하는지 에 대한 경험치를 쌓는다는 느낌으로 리뷰를 합니다.

4. 결국 답은 양치기다! 하지만 질 높은!

  • 마치 태클도 잘하고, 패스도 잘하고, 골도 잘 넣고, 리더쉽도 좋지만 연봉은 적은 축구선수와 같은 말이긴 합니다... ㅎㅎ
  • 저는 1,2,3 번의 과정을 힘들게 하고 있는데, 전공 동기생 친구는 그냥 별 생각없이 슥슥 풀어내길래 직접 물어봤더니 별 생각없이 그냥 몇 번 고민하면 자기는 풀린다고 하길래
    "도대체 무슨 차이지 ?" 라고 생각해봤습니다.

답은 절대적인 노출량의 차이였습니다.

  • 그 동기생 친구는 취미가 뭐든지 자동화하기 였습니다 허허...ㅎ 예를 들면, 실습 과제 화면을 캡쳐해서, 특정 폴더에 모아두고, 프로그램을 종료하면 해당 폴더를 과목명학번이름으로 압축해서 미리 등록된 교수님 이메일에 전송해주는 프로그램 같은걸 만드는게 취미였습니다.

  • 여러 조건들을 만족하면서, 프로그램을 만들다보니 문제를 해결하는 알고리즘 문제 풀이와 동일한 과정에 계속해서 노출되면서 자연스럽게 그런 능력이 길러졌고, 알고리즘 문제들도 슥슥 잘 풀었던거죠! 외국에 살다와서 영어 잘하는 친구? 와 비슷한 맥락이라고 생각합니다!

  • 따라서 절대적인 노출량 증가를 위해선 계속적인 반복 훈련이 필요합니다.
    (이런 훈련을 계속해서 할 수 있는 사이트들은 5주차에 소개하고 있습니다)

  • 반복적인 훈련을 통해서 "어떤 류의 조건들에는 어떤 식의 해결법이 쓰이더라~" 와 같은
    절대적이진 않지만, 대부분의 경우 먹히는 당황하지 않고 유연하고, 능숙하게 해결할 수 있는 경험치를 쑥쑥 먹어야합니다! 말이 좀 애매하네요 😢

다만, 주의하실 것은 소위 "양치기"에 집중하시면 안됩니다.
필요한 것은 1,2,3 단계를 거치고 숙성된(?) 경험치입니다!


⚠️주의할 점⚠️

1. 왕도는 없다

위에 제시한 4가지의 과정은 단순히 저의 학습 경험이고,
절대로 절대로 절대로! 왕도가 아닙니다!
각자 갖고 있는 선행 지식도 다르고, 학습의 속도, 취향, 기억하는 방식이 다르기 때문에
각자에게 맞는 방식으로 알고리즘을 학습하시면 됩니다!

2. 당연히 시간이 필요한 문제에 조급해 하지 말자!

앞서 말했듯이 절대적인 노출량의 차이는 정말 중요합니다.
다르게 말하면, 누구나 충분한 시간만 주어진다면 할 수 있다는 말이죠!
그러니까 너무 조급해하지마시고, 천천히 절대적인 시간량을 투자해보세요!
할 수 있습니다!!!! 👌


profile
개발자 싱상형

0개의 댓글