Weekly I Learned/2022's(7. ~ 12.) WIL

2022년 8월 3주차(8/15 ~ 8/19) Weekly I Learned "뚜벅뚜벅 걸어가기"

ikjo 2022. 8. 22. 10:08

지난 한 주 되돌아보기

한 주 한 주가 시간이 정말 빠르게 흐르는 것 같다. 특히, 마스터즈 코스를 수료한 이후로는 뭔가 이전 보다 더욱 시간이 빨리 흘러가는듯한 느낌이다. 이렇게 한 주 한 주 시간이 흘러가면서 "내가 지금 제대로 하고 있는 건가?"라는 의문이 들 때도 종종 있었다. 또한 지금 당장 취업과 밀접한 프로젝트 등의 학습을 하지 않고 있다보니 조급함이 느껴지곤 했다.

 

하지만 일단은 처음 가졌었던 계획대로 당분간은 컴퓨터 과학, 자바, 자료구조, 알고리즘 등 기초 학습에 중점을 두고자 한다. 무엇보다 이러한 기초를 학습하면서 하나하나 배워가고 나의 부족한 점들을 채워가는 재미가 쏠쏠하다. 아울러, 장기적으로 개발함에 있어 이러한 지식들이 뿌리가 되어줄 것이라는 생각이 든다.

 

자료구조, 자바로 구현하면서 이해하기

이번 주에는 자바 스터디 과제의 일환으로 연결리스트, 스택, 큐, 이진 트리 자료구조에 대해 학습해보고, 주요 기능들에 대해 자바로 간단하게 구현해보는 시간을 가졌다. 그동안 알고리즘 문제 풀이 등의 학습을 하면서 앞선 자료구조에 대해 모르고 있었던 것은 아니지만, 이번에 그 내부 동작들을 구현해봄으로써 "아 이런식으로 돌아가는 거였구나"를 이해해볼 수 있었다.

 

 

GitHub - ikjo93/Data-Structure: Data structure that is implemented and learned in Java

Data structure that is implemented and learned in Java - GitHub - ikjo93/Data-Structure: Data structure that is implemented and learned in Java

github.com

 

나에게 익숙했었던 자료구조였던 스택과 큐의 경우에도 배열과 노드로 각각 구현해보면서 많은 것을 배울 수 있었다. 배열로 구현할 경우에는 배열 사이즈 대비 자료 사이즈에 따라 기존 배열의 크기를 늘렸다 줄였다 해줘야 됐고, (이 과정에서 환형큐를 처음 알게 되었다.) 노드로 구현할 경우에는 기존 연결된 노드 상에 노드를 이어주었다가 풀어주는 처리를 해줘야 됐다. 개인적으로 노드로 구현하는 것이 배열로 구현하는 것 보다 훨씬 간단했다.

 

이진 트리를 구현해보는 것도 트리를 이해하는데 정말 많은 도움이 되었다. 그동안 알고리즘 문제(주로 그래프 관련)를 풀면서 많이 접했었던 너비 우선 탐색과 깊이 우선 탐색을 트리에 접목시켜보니, 나름의 인사이트가 생기는 기분이다. 아울러 트리를 직접 구현해보니, 왜 트리를 이용한 탐색이 빠른지와 현대의 데이터베이스와 파일시스템 등에서 왜 트리 탐색을 이용하는지 생각해볼 수 있었다.

 

이와 관련하여 백준 알고리즘 문제 중 트리 관련 문제를 풀어보는 것도 나름 도움되었던 학습이었다.

 

 

[백준 - 1068] 트리 - Java

문제 설명 1068번: 트리 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다

ikjo.tistory.com

 

 

마침내 자바의 정석 1권 정독 완료

자바 스터디를 하면서 자바의 정석을 다시 읽어나가기 시작했는데, 마침내 1권을 모두 정독할 수 있었다. 그래도 마스터즈 코스에서의 경험들 덕에 그동안 배웠던 지식들을 정리하는 기분으로 읽을 수 있어 유익했었던 것 같다. 분량은 대략 520페이지 정도로 적지 않은 페이지였는데, 개인적으로 처음 자바를 학습할 때 정독을 시도했었다면 크게 도움이 되지 못했을 것 같다는 생각이 들었다.

 

자바 스터디 진행에 따라 이제 2권을 읽을 차례인데 컬렉션 프레임워크, 지네릭스, 애너테이션, 쓰레드, 람다와 스트림, 입출력 등 현재 나에게 있어 가장 부족한 부분들이 나오기에 기대가 많이 된다. 당초 2022년 목표였던 자바의 정석 정독 목표를 조기 달성할 수 있도록 좀 더 노력해봐야겠다.

 

어김없이 진행된 알고리즘 문제 풀이 및 학습

지난 한 주 역시 어김없이 알고리즘 문제 풀이와 학습을 진행해보았다. 특히, 지난번 카카오 코딩테스트 기출 문제를 풀어보면서 이분 탐색 시 Lower Bound를 찾는 로직을 경험해본적이 있었는데, 이번 기회에 정리하고 싶다는 생각이 들었다.

 

 

이분 탐색, Lower Bound와 Upper Bound - Java

이분 탐색이란? 우선 탐색이란 자료구조, 그래프 등에서 특정한 데이터를 찾는 것을 말한다. 대표적인 탐색 방법으로 '순차 탐색'이 있는데, 이는 어떤 자료구조에서 특정 데이터를 찾기 위해 첫

ikjo.tistory.com

 

개인적으로 작년도 마스터즈 코스 수강 직전에 나에 비해서는 알고리즘 기량이 훨씬 늘어난 것은 맞지만, 솔직히 아직은 알고리즘 문제 푸는 것이 많이 서툴다고 생각한다. 알고리즘은 마치 수학 문제와도 같은 것 같다. 한 문제 한 문제가 참 어렵지만, 문제를 풀고 나의 것으로 만든다고 해도 또 다른 문제를 보면 또 다시 헤매게 된다.

 

학창 시절 수학을 진득하게 공부해본적이 없어 경험해보진 못했지만, 알고리즘 역시 수학 문제처럼 꾸준히 하다보면 어느새 그동안의 지식들이 쌓아가면서 능숙해지는 시점이 온다고 한다. (그러다가 다시 또 암흑기에 빠진다고 한다. 🤣) 아무쪼록 알고리즘은 단기간에 승부를 보겠다는 생각보다도 장기적으로 꾸준히 해야 것 밖에는 답이 없어보인다.

 

프로그래머스 레벨 2의 문제도 이제 거의 얼마 안남았다. 이제 슬슬 레벨 3의 문제를 풀어야 하는데, 레벨 3은 레벨 2와는 비교가 안 될 정도로 어렵다는 여럿 경험담들이 있다... 😅 아무쪼록 2022년 목표 중 하나인 프로그래머스 레벨 3 다 풀기에 한 발자국 다가선 느낌이다.