항해 11일차 TIL
1. 앞으로의 공부 방향
1) 개념은 앞으로 문제 푸는데 필요한 만큼만 안고 가고, 적당히 이런게 있다는 정도로만 일단 배우자. 너무 제대로 배우려고 하기엔 지금 주어진 시간도 너무 짧고 비효율적이다.
코드업 기본 100제, 백준이나 프로그래머스에서 난이도 낮은 문제부터 시작해서 점차 단계 높여가기. 지금 책에 나오는 문제는 풀 수 있으면 좋고, 못 풀면 그냥 해답 보고 해석할 수 있는 정도에서 그쳐도 좋다.
문제 하나당 생각해보는건 최대 2시간 까지만. 다른 사람들과 풀이 및 접근방법 등 생각을 나눠보는 것이 더 도움이 된다.
못 풀고 해석을 본 문제들은, 다음엔 해석 보지 않고 풀 수 있도록 노력해보기. 다른 사람의 코드를 보지 않고 그대로 복기해 보는 것도 도움된다.
2) 코딩 테스트에서 중요한 것은 기본기.
기본 자료구조. 스택, 큐. 탐색 기본. 이중탐색. 최단거리. BFS, DFS. 정렬 기본. 머지소트. 퀵소트.
3) 공부 순서
백준, 프로그래머스 1단계나 기타 난이도 낮은 문제들 -> 파이썬 알고리즘 인터뷰 문제들
문제 푸는데 익숙해지면 리트코드에서 영어 원문 읽으며 문제 풀어보는 것도 좋다.
나중에 시간 많고 조금 더 알고리즘을 깊게 파고 싶다 : 폭넓은 지식, 수학적 증명(introduction to algorithms).
ACM-ICPC 레벨을 풀고 싶다면 : 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 1, 2.
나중에 취업 후 경력이 쌓였을 땐 C언어로도 풀어보기. 공간복잡도도 생각하게 된다.
2. 보기에 깔끔한 코드
오늘 팀에서 깔끔한 코드에 관한 이야기가 나왔다. 나도 파이썬 알고리즘 인터뷰 책 앞부분을 좀 읽으며 깔끔한 코드가 무엇인지 좀 알아보고, 좋은 습관을 갖도록 해야겠다.
1) 변수명과 주석
a = 0
for b in words:
c = b * a
a += 1
내가 자주 하는 짓인데... 변수명을 저런식으로 지으면 이게 뭘 의미하는지 힌트가 전혀 없다. 게다가 주석도 없으니 이 변수가 뭔지 알기 어렵다. 클린코드 책에선 주석을 달지 말라고 되어 있다던데, 클린코드 책이 자바 위주로 쓰여졌고 자바 외 언어에선 주석 달지 않는건 논란의 여지가 있다고 한다. 코딩테스트 같은 경우 주석 여부를 확인하고 인터뷰 시에도 주석을 함께 논의한다고 하니까 주석 다는 습관을 들이는게 좋을 듯 싶다.
time_passed = 0
for word in words:
study_time = word * time_passed
time_passed += 1
예제에선 주석을 달지 않았지만... 이런 식으로 변수 이름을 알아보기 쉽게 작성하는 것이 중요하다.
주석은 한글로 달아도 되지만, 영어로 작성하는 것에도 익숙해져야한다. 특히 코딩테스트 시에 영어로 주석을 달면 프로페셔널한 인상을 줄 수 있다고 한다.
2) 스네이크케이스, 카멜케이스
변수명을 작성할 때 snake case, camel case, capital case 셋 중 하나 정해서 맞춰야 한다. 파이썬의 경우 PEP 8 문서 기준에 따르면 스네이크코드를 쓴다. 마찬가지로 따옴표, 쌍따옴표도 둘 중 어느걸 쓸지 정해서 맞추는 것이 좋다.
3) 리스트 컴프리헨션
문법과 의미를 축약해서 나타낼 수 있는 파이썬의 기능. 굉장히 강력하긴 한데 가독성이 떨어진다. 당연하다... 난 읽지도 못하겠다; 너무 축약하는 것 보다 여러줄에 걸쳐 풀어서 쓰는 것이 가독성을 위해서라면 더 좋다. 리스트 컴프리헨션은 대체로 표현식이 2개를 넘지 않아야 좋다. 하지만 그렇다고 너무 하나하나 다 풀어서 쓰면 오히려 가독성이 떨어진다.
4) Zen of Python
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
음. flat is better than nested... 이게 정확히 어떤 의미일까... 단어 뜻은 알겠는데... 함수 안에 함수 넣는건 적당히 해라 뭐 이런건가? 모르겠다.
3. 오늘 생각
오늘은 시험 이후 특별히 정해진 일정이 없다보니 자꾸만 잡생각이 든다. 보다 만 웹툰도 마저 보고 싶고(극락왕생 진짜 재밌다!!! 살면서 이렇게까지 재밌는 웹툰은 처음이었다) 괜시리 아직 정하지 못한 2022년 목표도 세우고 가고 싶고 몸무게랑 체성분 비율 골격근량은 얼마나 되는지 인바디도 찍어보고 싶고 막 이것도 하고 저것도 하고 싶네...
손목이 너무 아파서 버티컬 마우스를 샀다. 조만간 손목 패드도 사야겠다. 사는 김에 키보드도...? 으음... 살게 너무 많네. 모니터도 하나 더 사야할 것 같은데. 으으으음...
뭔가... 개인 시간이 주어져서 밀린 공부도 하고 싶고 그랬는데... 뭔가... 음... 계속 늘어지네... 자꾸만 머리속에는 거품목욕 생각밖에 안들고... 음...
노트북이 있었으면 거품목욕 하면서 문제 풀고 싶은데... 음... 맥북 하나 살까...?
탑코더 검색하니까 리디에 웹소설이 나오네... 음... 리디에도 아직 사놓고 안 본 웹소들 많은데... 음... 으음...
소설 생각난 김에 좀 더 쉬운 파이썬 알고리즘 책들을 주문했다. do it! 자료구조와 함께 배우는 알고리즘 입문이랑 기술매니저님께 추천받은 이것이 취업을 위한 코딩테스트다, 이렇게 두권. 음! 토요일엔 도착하려나. 열심히 이 책들 보면서 풀어야지.
4. 마음 돌아보기
오랜만에 반신욕을 하며 잠시 내면을 살펴봤다. 내가 왜 지금 이렇게 방황하는지.
하반신 벌개지며 생각에 빠져들었다가 내린 결론은, '나는 지금 번아웃이 왔구나' 였다.
체력이 떨어진 탓도 컸지만, 내가 원하는 만큼 성과가 나오지 않는다는 점이 가장 큰 원인이었다.
나는 문제 하나도 못 풀어서 하루종일 개념만 구글링하고 있는데, 다른 사람들은 문제를 슥슥 풀어서 가져오고, 심지어 이걸 설명해주고 있는데 난 여전히 설명을 들어도 잘 모르겠고... 이 와중에 겨우 문제를 스스로 풀 수 있을 정도의 실력으로 올라오니 별3개짜리 문제가 수문장처럼 나타나고, 또 바로 이어서 시험도 보고...
시험 문제를 시간 내에 못 풀었다는 것은 사실 내게 별 타격감을 주진 않았다. 내가 못 풀거란건 어느정도 알고 있었으니까. 그래도 풀이법은 어느정도 맞게 접근했지 않았을까 하는 기대감이 있었다. 그런데 다른 사람들의 풀이를 보고 나니 아예 접근 자체가 달라서 그냥 그때부터 확 기가 죽어서 가라앉아버린 것 같다.
이제 원인은 알았으니까 이제 이걸 어떻게 해야할까 고민해봤는데.
답은 그냥 즐기기. 즐기는 수 밖에 없는 것 같다.
알고리즘을 공부하는 이유가 뭔지 생각을 해보자. 물론 코딩테스트를 보는 회사에도 지원하기 위해서긴 하지만, 그 회사들이 코딩테스트를 보는 이유가 뭘까. 내가 기본에 대한 이해가 있는지를 보기 위해서가 아닐까.
나는 구조를 이해하는 것에 중점을 둬야겠다. 문제를 풀 수 있고 없고는 나한테 중요하지 않다. 이 문제들은 어려운게 맞고, 내가 못 푸는게 당연하다. 못 푸는 문제들에 매달리면서 자꾸 스스로 자존감 깎아먹지 말자.
사실 매니저님, 기술매니저님, 튜터님 모두가 다들 한번씩 말씀해주신 내용이긴 한데... 사실 그냥 들을 땐 잘 모르고 대충 넘겼다가 꼭 이렇게 피보고 나서야 깨닫는단 말이지. 진작에 말 잘 들었으면 얼마나 좋아? 남이 해주시는 말은 좀 잘 챙겨듣자.
알고리즘 입문 책이 빨리 왔으면 좋겠다. 입문 책 떼고, 필요하다면 취업을 위한 코딩테스트 책도 떼고, 그 다음 파이썬 알고리즘 인터뷰 책을 다시 공부해야겠다.
나는 나만의 속도로 가자.