알고리즘

알고리즘 벼락치기에 대한 보고

한비 2023. 4. 9. 14:54
반응형

 알고리즘 공부를 언제 처음 시작했냐고 묻는다면 작년 1월쯤이었던 것 같다. 2학년 2학기에 자료구조를 수강한 직후 선배가 하는 스터디에 슥 들어가서 문제를 풀었는데 내용에 대한 깊은 이해나 주도적인 사고 없이 그냥 ... 흐르는대로 ... 스터디 날짜가 다가오는대로... 어떻게든 문제를 풀거나 모범 답안을 이해하려고 노력해서 스터디에 참여하곤 했다. 지금 생각해보면 왜 그런 짓을 했나 싶고 날 견뎌준 선배에게 너무나 감사하다. 심지어 막 스터디를 시작했을 때는 할줄 아는 언어가 2학년 내내 배운 자바 뿐이라 (유니티 하면서 C#을 쓰긴 했는데 코테용으로는 좀) 처음에는 자바로 코드를 쓰다가 두달쯤 후부터는 파이썬을 배워서 파이썬으로 풀었다.

 

 그러고 나서 22년 상반기까지 어영부영 파이썬으로 조금씩 풀다가, 2학기때는 학부의 코테 대비 튜터링에 들어가서 유형별 이론을 배우고 과제로 그 이론에 해당하는 문제를 풀기 시작했다. 그런데 또 문제가 있었다. 이 멘토링은 C++만 가능해서, 파이썬을 내려두고 C++로 문제를 풀고 코드리뷰를 받게 되었다. 이렇게 파이썬을 홀라당 다 까먹었다. 게다가 이때 교환학생 파견 나간 상태에서 온라인으로 수강한 거라, 과제는 거의 다 내긴 했지만 아주 성실하게 참여했다고는 할 수 없었다. 이때의 실력을 말해보자면 쉬운 문제(백준 실버 3 이하 정도?)만 자력으로 겨우겨우 풀 수 있었고, 중간 이상 난이도는 거의 모범답안을 이해하는 식으로 따라갔던 것 같다. 이론 강의를 완벽하게 이해하지 못한 상태에서 시간에 쫓겨 과제 문제를 풀다보니 그랬다. 왜 그렇게 살았지 진짜

 

 그렇게 한국에 돌아오니 2023년이 되었고, 나는 다시 한번 C++과 파이썬의 기로에 섰다. 두 언어를 다 써보고 느낀 점을 적어보자면, C++은 진짜 빠르다. 내가 코드를 좀 바보같이 짜도 웬만하면 시간초과는 잘 나지 않았다. 시간초과가 나면 전적으로 내 잘못인거다. 대신 코드가 좀 길고 문법이 어렵게 느껴져서 초반에 익힐 때 좀 헤매였다. 반면 파이썬은 문법은 정말 쉬웠다. 오랜만에 파이썬 다시 하는데 얘는 뭐 자료형도 안 물어보고 세미콜론도 안 붙이고 함수에 중괄호도 안 써서 그냥 모든게 충격적이고... 근데 결국 쉬워서 좋았다. 하지만 진짜 느리다. 튜터링 때 C++로 풀었던 문제를 파이썬으로 다시 풀어봤는데, 제출할때마다 메모리랑 시간 차이가 너무 심해서 깜짝깜짝 놀랐다. 그래서 파이썬은 내가 알고리즘을 조금만 바보같이 짜도 얄짤없이 시간 초과가 나왔다. 강제 리팩토링;

파이썬 너 뭐하묘

 

 그렇지만 결국엔 파이썬을 선택했다. 이유는 좀 황당한데, 내가 고민하고 있으니까 같이 프로젝트 하던 선배가 코테는 파이썬이라고 강추하셔서 그냥 홀라당 넘어갔다. 귀가 종잇장인듯... 그렇지만 지금 시점에서는 정말 만족한다. 코드가 짧고 간결하고 쉬워서 참 좋다. 속도도 뭐 ... 점차 빨라지고 있다고 한다 ...

 

 그렇게 1월부터 2월 초까지는 튜터링 과제를 파이썬으로 다시 풀면서 이론 복습하고 파이썬에 다시 적응하는 시간으로 보냈다. 그러다 2월 중순부터는 지원서와 레주메의 굴레에 빠져 수정하고 수정하고 또 수정해서 동아리랑 이곳저곳 지원하는 데 시간을 썼다. 이때 잠깐 알고리즘을 소홀히 했더니 다시 매일매일 풀기가 어렵더라. 그렇게 3월 초에 인턴 코딩테스트를 보고 난 후, 현타가 와서 (...) 빨리 알고리즘 이론 전체를 다시 공부해야겠다는 생각이 들었다. 그래서 작년에 사둔 이취코(이것이 취업을 위한 코딩테스트다) 파트 2 이론 부분을 공부하는데 또 2주 정도를 보냈다. 그렇게 이론 1회독을 하고 나니 웹 개발 동아리에서 위기감을 느껴서 인턴 연락도 없겠다 한 일주일만 알고리즘 쉬고 리액트 공부를 해야겠다 싶었다.

 

 일주일 동안 리액트를 열심히 하고 나니 ... 거짓말처럼 인턴 연락이 왔다. 작년에는 서류탈해서 기대도 안하고 있었는데 레쥬메를 잘 깎았나 ... 약간 감동적이었다. 그리고 곧 현실을 깨달았다. 아니 면접을 바로 다음주에 본다는 거다. 근데 이 곳의 면접은 100% 알고리즘 문제 풀이다. 나는 발등에 떨어진 불이 잘 타오르는 걸 보며 큰일났다 ... 이 생각만 했다. 

 

 그렇게 시험기간 모드에 돌입했다. 내가 시험공부를 시작할 때 항상 맨 처음 하는 것은 시험 범위를 목차로 쭉 정리하는 거다. 알고리즘 이론을 다 따로따로 배우니까 서로 어떻게 유기적으로 연결되는지, 각 이론의 시간 복잡도는 어떤지, 문제를 봤을 때 어떤 이론을 써서 풀어야 하는지를 하나도 모르겠어서 그 부분의 감을 잡는 것부터 시작했다. 근데 바쁜 일은 한번에 몰려온다고 동아리 세미나 준비도 하고 스터디 과제에 이런 저런 일정이 다 겹쳐서 진짜 죽을뻔 ...

 

 그래도 죽지 않으니까 어떻게든 해내고 첫 면접이 있는 주가 되었다. 이때부터는 leetcode Top Interview Question을 풀기 시작했다. 영어 면접 한국어 면접 한번씩 봐야하는데 언제가 무슨 언어인지를 안 알려줘서 ,,, 그리고 어차피 외국계 기업이니까 그냥 leetcode를 풀었다. 이걸 풀면서 문제 먼저 읽고 / 조건 확인하고 / 풀이 방법 여러 개 생각하고 / 하나 골라서 구현하고 / 맞춘 후에 discuss 란의 다른 풀이 보고 하는 프로세스를 익혔다. 이렇게 하니 한 문제 푸는데 40분 ~ 1시간 ... ㅎㅎ 별 수 없다... 해야지... 그래도 이걸 반복하다 보니 언제 무슨 알고리즘을 쓰는지에 대한 감이 아주 콩알만큼 오는 것 같다. 

 

 지금은 두번째 영어 면접을 바로 앞두고 있는데... 이렇게 말도 안되는 알고리즘 벼락치기를 하면서 느낀 바가 있다.

내가 대만이인지 대만이가 나인지

지금이라도 이해해서 다행인가 싶기도 하고 ... 그래도 지금 공부하는 이 방식대로 코테 준비하면 앞으로 다가올 다른 기회에는 더 준비된 모습이 될 것 같기도 하고 ... 그렇다. 뭐든 미리미리 하자.

화이팅 !

반응형