518일동안 단 하루도 빠지지 않고 알고리즘을 풀었다.

Jay Lee
devserum
Published in
14 min readJul 2, 2023

이 글은 기존 kwiki -> medium 이전 작업에 따라서
2021–06–01 에 작성된 “518일동안 단 하루도 빠지지 않고 알고리즘을 풀었다.” 글을 마이그레이션 한 것입니다.

제가 최근 1년간 코딩하면서 가장 많이 들은 음악을 들으면서 읽어보시는건 어떠세요?
(링크 깨짐)

서론

‘365일동안 하루도 빠지지 않고 알고리즘을 풀었다.’
라는 제목으로글을 쓰는것을 330일쯤 생각했는데
바쁜 나날들에 치여서 어느덧 시간이 훌쩍 지나버렸다.

어느덧 500일이 넘었고 어떤 이유에서인지 연속 콤보가 깨졌는데 이참에 한번 정리 해보고 뒤돌아 보는것도 좋겠다 싶었다.

시작전에 알고리즘 트레이닝 사이트를 몇개 소개 하자면

  • Codewars
  • Leetcode
  • HackerRank
  • Codility
    등이 있다.

플랫폼별 차이는 추후에 서술하고 이 과정동안 나의 생각과 행동, 그리고 심경 변화들을 적어보려 한다.

어떤 이유에서 알고리즘을 풀기 시작 하신건가요?

여러분이 코딩할때 복사 붙여넣기를 하지 않는다면 세레모니코드를 제외하고 아마 하루 평균 100줄 짜기도 힘들것이다. (적어도 나는 그렇다;)

개인적으로는 100줄이상 짠다면 복붙일 가능성이 매우 높다고 생각하는데 물론 리누스 토발즈님이나 DHH, 제임스 고슬링 같은 천상계 분들은 논외로한다.

보통 회사의 정규 근무시간은 8시간+식사시간 인데, 어제 짜놓은 코드 100줄 을 옆에 놓고 똑같이 따라치면 바로 퇴근 할 수 있다고 할때 많은 사람들이 10분이면 따라치고 퇴근 하지 않을까?

자 그럼 우리는 7시간 50분을 타이핑 하는 시간이아니라 생각하는 시간에 사용 한다는 것인데
결국 이 모든 행위는 논리적 사고를 기반으로 가설을 세우고, 증명하는 일련의 과정들이다.

개인적으로는 가설 세우고 증명하는 과정은 10%정도고 90%는 학습시간이라고 봐도 무방한것같다.
인터넷 선을 뽑고 코딩 하라면 할 수는 있겠지만 생산성은 밑바닥을 치지 않을까?
나는 사실상 인터넷에서 뭔가 검색하는 행위 자체가 학습시간 이라고 본다.

전에 읽은책들중 정확히 기억이 안나지만 인상에 남는 구절이 있었는데
‘프로젝트가 실패하는 이유들중 하나는 지식의 부재, 훈련부족으로 인한 역량의 부재’ 라는 늬앙스의 글이 있었다.

생각해보라, 당신이 지난 1달간 한 일을 다시 한다면 똑같이 1달이 걸리겠는가?
아마도 시간이 크게 단축 될것이고 이것은 당신이 학습하는데 꽤나 많은 시간을 소비 했다는것을 의미한다.

그렇다면, 우리가 이 생각하는 능력을 좀더 강화하거나 개선시킨다면, 이를테면 딱 13%만 개선 시켜도 우리는 1시간을 아낄 수 있다.
13%개선 시켜서 벌어들인 그 1시간을 다시 생각하는 방법 강화, 개선에 재투자 하고,
또다시 개선된 방법으로 또다시 시간을 절약하는 프로세스를 반복한다면…

어쩌면… 이것이 지속 가능한 향상 방법 아닐까?
라는 생각을 했다.

그리고 그 방법론으로 나는 이런 퍼즐(알고리즘)들을 풀면 사람의 두뇌를 꾸준히 훈련 시킴으로써 업무 생산성을 높일수 있다는 생각이 있었다.

그리고 이 가설을 검증 하기 위해 기꺼이 약 2년이 넘는 시간동안 실천 해 보았고 그 과정들에서 내가 느낀점을 적어 보려고 한다.

그래서 어느정도 풀었나요?

들어가기 전에 우선 현재 진행상황부터 보여주자면 코드워즈 약 800문제, 릿코드 약 80문제
대충 880문제정도 풀었다.

우선 랭킹과 연속으로 푼 날들을 보자.

약 800문제 정도 풀었고, 랭킹은 약 상위 0.5%정도 되었다.
연속으로 518일동안 하루도 빠지지 않고 풀었다.
518일째날 정말 아쉽게도 어떤 이유에서 집계가 안된거 같다.

신기록을 세우려면 1년 반을 다시 해야 한다니… 하아…

아래는 언어별, 난이도별 통계이다.

JS 711, Python 165, SQL 71 을 합치면 942문제 이다.
랭킹에 약 800문제 푼것으로 되어 있는데 같은 문제를 다른 언어로 푸는것은 점수나 랭킹에 반영되지 않기 때문이다.

최근에는 심심해서 leet code도 풀어보고 있는데 78문제 정도 풀었다.

왜 CodeWars에서 주로 문제를 풀었나?

여러 사이트를 기웃 거렸는데 문제 출제 스타일이 좀 차이가 있다.

CodeWars는 “자 여러분 이건 이런거고 이건 이런거에요 응용해볼까요?”
느낌인 반면 다른 사이트는 좀 불친절하다.

그리고 문제 pool자체가 차원이 다른데 CodeWars는 유저들이 주도적으로 문제를 출제하고 Beta상태가 된 후에 사람들이 문제를 풀고, 업그레이드 하고 정식 릴리즈 되는 식이다.
그리고 문제 자체에 대해서 이 문제가 좋은 문제인지 투표를 한다.

CodeWars를 이용할때 positive feedback으로 정렬해서 문제를 보면 괜찮은 문제들을 쉽게 고를 수 있다.

그리고 문제를 풀고 나면 다른사람들의 Solution들에 대해서 BestPractice(최고의 답안), Clever(똑똑한 답안)두가지로 나눠서 투표 할 수 있는데, 자동으로 BestPractice,Clever가 상위에 노출된다.
BestPractice는 오로지 효율성 즉 Time Complexity, Space complexity에 목숨을 거는 반면 Clever는 다른 시야를 준다.

난 이 매력에 빠져버렸다.
다른 사람이 짠 코드를 보면서 “진짜 예술이네…” 라는 감탄을 셀수없이 했다.

알고리즘을 푸는것 그 자체만으로도 좋은 훈련이겠지만 투표를 통해 선정된 최고의 답안들을 보는것은 정말로 차원이 다른 세계를 접하게 해준다.

단! 알고리즘 푸는 목적이 면접용 이라면 codewars말고 다른곳을 추천한다.
(어차피 면접에서는 몇일씩 걸리는 문제를 내지도 않기때문;…)

알고리즘을 공부하면서 함께 한 노력들.

영어

전세계 인구 76억 중 한국인은 전체 인구의 약 0.6%밖에 되지 않는다.

인류가 쌓아온 대부분의 지식은 웹을 통해 손쉽게 접근 할 수 있는데, 이 훌륭하고 방대한 자료들의 대부분은 영어이다.

그 말인 즉 언어적 제약을 극복 할 경우 내가 액세스 할 수 있는 자료의 양이 100배가 넘는다는 뜻이다.

영어공부에 대한 더 자세한 내용이 궁굼하다면 이전에 써둔 글 영어 공부하기 를 참조하기 바란다.

이런 생각은 10년도 전에 한거 같은데 그때부터 어찌어찌 조금씩 공부를 하다보니 운이좋게 외국인으로만 구성된 팀에서 근무도 했고, 미국 스타트업에서 원격 근무도 2년정도 했었다.

작년부터는 책도 kindle에서 영문 원서를 사서 읽기 시작했다.

영어기반 수학공부

위 스크린샷은 2018년 1월 1일부터 2020년 12월 31일까지 khan academy라고 불리는 곳에서 학습한 시간 통계이다.
문제 푼시간 10094분 + 영상 시청시간 20416 = 30510 분.
3년간 약 508시간을 공부했다.

애초에 더 나아갈 발판을 위해 수학 강의를 들은 것이기 때문에 모든 강의는 당연히 영어로 들었고, 말그대로 유치원 과정부터 그냥 영어로 다시 했다.

유치원 과정부터 고1~2수준 정도까지만 공부했는데 개인적으로는 정말 재미있게 공부를 했고 지금까지 내가 배운 수학이 통째로 잘못 됐구나를 느꼈다.

혹시나 수학 공부할 사람을 위해 조금 더 적자면 개인적으로는 Khan Academy의 Khan은 Algebra(중학교~고1)를 설명 잘하지만 이후 과정 이를테면 calculus같은것들은 Youtube에 더 설명 잘하는 사람들이 많다.
(위에 466시간은 Khan academy 통계이고, 그 외에도 유튜브에서 공부했다)

얼추 하고나서 MIT 6.042J Mathematics for Computer Science, Fall 2010를 들어보길 바란다.
(멘탈 브레이킹!)

알고리즘 강의

위에 영어와 수학을 디딤돌 삼아 강의를 듣기 시작했다.
꽤나 많은 강의를 들었는데 All time №1을 꼽으라면 나는 MIT 강의를 절대적으로 추천한다.
알고리즘 뿐만 아니라 Finance쪽 강의도 정말 대단히 잘 설명한다.

MIT는 대부분의 실제 강의를 자체 사이트와 유튜브에 함께 업로드 해준다.
정말 월드 클래스 강의를 무료로 들을수 있다.

이 이외에 개인적으로 추천하는거는 SICP(마법사책)을 공부 해보는것도 추천한다.
SICP는 MIT출판부에서 출판한 책이다.

All time №2는 Stanford강의다.
진짜 잘 설명한다.

가이드가 필요하다면 아래 페이지들을 참조하기 바란다.

- 자료구조및 알고리즘 학습하기

- MIT OCW

- Learn Computer Science

때때로 코드가 아닌 수학 기호로 써보려는 노력들도 좀 했었다.

Are the numbers in order? 라는 문제는 아래처럼 표현하기도 했었다.

코드로 표현하면 아래처럼 된다.

그래서 무엇을 얻었습니까?

알고리즘을 풀면서 각 단계별 심경 변화를 대신 적어보려 한다.

100문제 쯤 풀었을때 — 더닝크루거 효과

100문제 쯤 풀었을때 자신감이 많이 붙었었는데 돌이켜보면 기고만장 했던것같다.

쓰레기 같은 코드가 아니라 쓰레기를 만들고 있었고,
문제를 풀고나서 다른사람이 제출한 코드로부터 무언가를 제대로 배우지 못했다.

더닝크루거 효과를 들어 보았는가?
내가 가진 자신감은 무지에 기반했다.

우매함의 봉우리에서 그저 춤을 추고 있을 뿐이었다.

200문제 쯤 풀었을때

200문제 쯤 풀었을때 내가 쓰레기를 만들고 있다는걸 인지할 정도의 수준이 되었다.
나의 자신감은 더이상 떨어질 곳이 없는것만 같았다.

준비된 자에게 기회가 온다고 하지 않는가?
아마 이때쯤 나는 배울 자세가 된게 아닐까 생각한다.

사실 나는 이때쯤이 절망의 계곡인줄 알았다…
그러나 절망의 계곡인줄 알았던 그 지점이… 번지점프대였다…

내가 만든 코드가 너무나 보잘것없었다.
그리고 어쩌면 나의 생각의 한계가 언어로부터 나오지 않을까 하는 생각을 하게 되었다.

언어 결정론 이라는 말을 들어본적 있는가?

인간의 사고는 그 인간이 학습한 언어의 테두리 안에서 이루어 진다는 이론인데 쉬운 말로 하면 우리가 무언가를 갈망하기 위해서는 그 무언가를 인지 해야 한다는것이다.

좀더 쉽게 설명하자면 필자는 국밥을좋아하고 자주 먹는 편인데 한국 반대편 어느 섬나라에 사는 사람이 단 한번도 보지도 듣지도 못한 나의 국밥집을 갈망 할 수 있을까?

No.

우리가 어떤사고방식을 이해하거나, 갈망하기 위해서는 어떤 컨셉에 대해서 이해 해야 하는데 보통은 이것의 출발점 즉 생각의 기반은 언어가 되므로 그 언어에 대한 개념이 필요하다.

물론 이러한 언어결정론은 나와 같은 평범한 사람에게 주로 적용되며, 역사에 획을 그은 언어 창시자들은 이러한 언어 테투리 자체를 넓혀버리는 선구자들이다.

내가 그런 선구자가 아니고서야 결국 나의 생각을 확장 하기 위해서는 새로운 언어의 학습이 필요하다는게 나의 중론이었고 이때부터 나는 같은 문제를 여러 언어들로 풀어보기 시작했다.

주로 JavaScript, Python을 같이 풀었는데
특이한 케이스로 가장 많이 풀었을때는 CPP, JavaScript, Python, Scala 총 4개 언어로 풀었다.

해당 문제는 문자열에서 단어가 5글자가 넘어갈경우에 해단 단어를 뒤집어서 리턴 하는 쉬운 문제다.

spinWords( "Hey fellow warriors" ) => returns "Hey wollef sroirraw"

미리 말씀 드리지만 업무 할때는 이렇게 코딩하지 않습니다!
이건 어디까지나 Just for fun 이기 때문에 부디 자비를…

JavaScript

Python

Scala

CPP

위 코드들을 보면 알겠지만 제일 못하는 CPP이 제일 더럽다(…)

300문제 쯤 풀었을때

처음 시작할때 250,000등이 넘었는데 이때쯤 랭킹 상위 2%진입 한것 같다.

이때쯤 Python을 170문제정도 풀었는데 파이썬보다는 JS에 집중 해보기로 생각이 들었다.

그리고 SQL도 70문제정도 풀었는데 SQL은 문제 풀이 워낙적어서
Easy는 다 풀었고,,, medium도 쉬운건 거의다 풀었고…
남은건 손떨리는 문제들밖에 없어서 자의반 타의반 JS에 집중하기로 했다.

500문제쯤 풀었을때

이때쯤 1%에 진입 하기 직전인거 같은데 하루에 Easy난이도 한문제 풀어가지고는 랭킹이 떨어졌다.(!?)
Easy와 Medium점수가 4배 차이나기 떄문에 Medium을 풀지 않으면 랭킹이 떨어진다;…

랭킹같은거 신경 안썼는데 1% 근처가 되니까 조금만 더 하면 될거같아서… 랭킹을 신경쓰기 시작했는데 하… 독한놈들이었다…
돌이켜보면 99% -> 2%까지 간 노력보다 2%->1%가 더 힘든거같다.

이때 문제풀면서 드는 생각은
“니넨 잠도 안자냐?…” 였다.

랭킹 상위 1%진입 하면서 든 생각 — 임포스터 신드롬

대단한 사람들의 코드를 보며 넘을수 없는 벽 같은 그 무언가를 만나며 나는 딱 내가 얼마나 멍청한지 인지할 정도만의 혜안을 얻었다.

차라리… 아무것도 몰랐더라면 지잘난맛에 살았을텐데…
그런 생각을 해본다.

벼는 익을수록 고개를 숙인다는말이 겸손한 사람을 뜻하는건줄 알았는데
나는 문제를 풀면 풀수록 부끄러움에 고개를 숙인다.
겸손하고 싶어서 고개를 숙이는게 아니라 부끄러움에 고개를 숙인다.

랭킹 상위 0.5%에 진입하면서 든 생각

배움에는 끝이없다.

여담

왜 이렇게 열심히 하셨어요?

위 알고리즘 푼거는 그냥 취미로 한거고 목숨걸고 하지 않았다.
따로 공부하고 싶은거 다 하면서 하루 1~2시간정도 했다.
그냥 물방울이 바위 뚫듯이 쭉 한것 뿐이다.

시간이 없거나 재미 없을때도 있지 않아요?

그럴때는 아주 기초적인 문제인 8kyu를 풀었다.
8kyu는 그냥 아주아주 기초적인 문제인데 의외로 배우는것들이 종종 있다.

주 타겟은 7,6,5 kyu였다.

Codewars난이도는

  • 8~7은 fundamental
  • 7~6이 easy
  • 6~5가 medium
  • 5~4가 hard 정도로 보면 된다.
  • 3부터는 각잡고 풀어야 할거 같다.
    원래는 4kyu까지 싹다 풀고 3kyu를 풀려고 했는데 문제 pool이 이렇게 많을줄 몰랐다;;;;

근데 사람들이 출제 하는 것이다 보니 6kyu가 10분만에 풀리는 난이도 일때도 있고
7kyu를 몇시간씩 붙잡고 해야 하는경우도 왕왕 있다.

‘알고리즘 그게 실제 코딩에 도움 안되는거 아니냐’,

‘개발하는데 기본적인 연산만 쓰지 않냐’,
‘왜 오픈소스를 보면서 공부해야해요?’
라는 질문을 들은적이 있는데…

이런말 하면서 복잡도 이해없이 짜서 DB에게 가혹행위를 시킨다던지…
애초부터 잘못짠 소스를 리팩토링 한답시고 붙잡고 앉아있는 경우를 많이 봤다.

결국 이 모든건 Back-end Front-end를 떠나서 서버비용 증가, 사용자 경험을 저하등 많은 문제를 야기한다.

나는 알고리즘이 실제 문제 해결에 분명히 도움이된다고 생각한다.
또한 System Design을 효율적으로 설계 하는데도 도움이 된다고 생각한다.

알고리즘 트레이닝은 당신에게 ‘무엇이 잘못됐는지’ 파악하는 시간을 단축 시켜 준다.
어쩌면 이 트레이닝을 통해서 당신이 죽을때까지 깨닫지 못하는 무언가를 알게 될 수도 있다.

아는만큼 보인다.

맺음말

이제 어떻게 공부를 시작해야 할지 알것도 같다.

어쩌면 지금이 절망의 계곡을 지나 깨달음의 비탈길의 시작점이 아닐까 하는 희망을 가져본다.

위 스샷을 직접 보고싶으신 분들으 저의 Codewars Profile링크를 참조 하세요.

부록 — 트레이닝 사이트별 스타일

Codewars — 트레이닝이 주 목적임

문제 pool이 어마어마하게 많음. LeetCode에 있는것도 거의 다 있음.
진득하니 공부 하고 싶다면 Codewars강추 하고 면접용 이라면 LeetCode를 추천.

7kyu(easy)난이도 인데도 불구하고 진짜 몇날 몇일 매달려야 하는 문제가 한두개가 아님.
재밋어서 하는거 아니면 낙오하기 딱 좋은 플랫폼.

LeetCode — 시험을 위한 문제가 주 목적에 가까움.

Codewars스타일과 큰 차이가 있음.

Codewars에서 면접용 문제만 추출 해낸 버젼이라고 봐도 무방

한가지 CodeWars보다 확실히 나은점은 SQL문제 pool이 넓은 편인데 MySQL로만 풀어야 해서 아쉬움이 좀 크다.

PostgreSQL의 시대는 온다!!!!!!
(CodeWars는 PostgreSQL로 풀 수 있음)

--

--