당연히 해야한다고 생각했던 스터디
내가 스터디를 만든 이유는 거창하지 않다. 그저 취업을 하고 더 나은 미래를 위한 투자였다.
취업 시장을 100% 안다고 말할 순 없지만 어느정도 규모가 있는 회사들은 코딩테스트가 필수적인 것으로 알고 있다.
따라서 코딩테스트를 공부해야했고, 프로그래머스 데브코스에 들어와 스터디원을 모집하였다.
목표는 오직 취업
내가 생각한 개발자 스터디의 목표는 당연히 "취업"이라고 생각한다. 그렇다면 내가 원하는 회사에 맞춰 공부를 해야한다고 생각했고, 최소 프로그래머스 Lv2~Lv3, 백준 골드급은 30분 내에 풀어내야한다고 생각했다.
나를 포함한 스터디원들은 당장 Lv3, 골드급의 문제를 풀 수 없는 수준이라고 판단하여 기준을 낮추되 빠르게 레벨을 올릴 수 있는 방법을 고민했다.
빡세지만 부담스럽지 않게
스터디 방식은 "코딩 테스트 합격자 되기" 책을 기반으로 개념 학습과 기초 문제를 풀어보고 Lv2~Lv3, 골드 수준의 문제들에 도전하는 방법을 채택하였고, 이해가 안되는 부분은 구글링과 강의를 통해 추가 학습을 진행하였다.
1주일동안 정해진 챕터의 개념을 공부하고 배운 개념을 문제에 적용하며, 이해가 안되는 부분은 서로 질문을 통해 함께 발전했다. 매주 수요일 20시에 슬랙에 모여 서로 풀어온 문제들을 발표하고, 서로의 피드백하는 시간을 가졌다.
쉬운데 어렵고, 어려운데 쉽고, 미치겠다
알고리즘 종류 : 배열, 스택, 큐, 해시, 트리, 집합, 그래프
인상 깊었던 문제 : 이가 빠진 트리 : 골드 5
-> https://www.acmicpc.net/problem/26260
사실 이 문제는 트리를 실제 알고리즘에 적용하면 어떤 느낌일까? 하며 스터디원과 조금 어려운 문제를 선정하여 도전했던 문제였다. 그러나 조금 어려운 수준이 아니었고, 모든 스터디원의 멘탈을 부쉈던 극악의 문제를 만나게 되었다. 심지어 JavaScript로 이 문제를 맞춘 사람은 현재 총 4명이 있고 그 중 2명은 나와 스터디원 의O님이다.
나의 문제 풀이 방식은 수열에서 아이디어를 가져와 재귀함수로 풀었고, 의O님은 재귀함수를 돌며 특정 조건에서 재귀함수를 멈추는 방식으로 풀었다. 결론적으로 재귀함수를 이용했지만, 서로 매우 다른 코드의 양상을 보이고 있어, 동일한 동작을 하는데 이렇게까지 코드가 다를 수도 있다는 것을 느끼게 되었다.
자바스크립트 && 알고리즘 === "양날의 검"
알고리즘 스터디를 통해 배운 점은 JS와 알고리즘의 양면성이었다. JavaScript 언어가 정말 유연하고 문법이 다양하여 문제를 풀때 잘 사용하면 신기하게 풀어 아름답다고 생각을 하였다. 그러나 큐, 트리, 그래프 등을 직접 구현해야하는 번거로움이 있었고, 언어가 너무 유연한 나머지 내가 원하는대로 작동하지 않아 한참 헤메는 사건사고가 매우 자주 일어났다.
알고리즘을 어떻게 적용해야할지 학습하고 익숙해지면서 해당 알고리즘이 없었다면 어렵게 풀었을 문제를 너무 쉽게 풀 수 있어 놀라웠고, 반대로 모든 문제를 알고리즘으로 풀려고 하니 아주 쉽게 푸는 방식이 있는데 굳이 어렵게 푸는 아이러니한 상황을 마주쳤다. 어떤 알고리즘을 쓸지? 쓰지 않을지 판단하는 것 자체가 회사에서 원하는 근본적인 문제 해결력 아닐까? 라는 생각을 하게 되었다.
천리 길도 한 걸음부터.
완벽하지 않고, 많이 부족했지만 얻어가는 것이 꽤 있는 나의 첫번째 스터디였다.
여러 우여곡절이 있는 스터디였다. 배웠던 점, 좋았던 점, 나빴던 점이 여럿있는 경험이었다. 만약 다른 스터디를 진행한다면, 확고하고 동일한 목표를 가지고 있는 스터디원끼리 모여 진행하면 더 좋을 것 같다. 스터디를 진행하며 조금씩 엇갈리는 목표와 의견들이 있을때 이를 하나로 수렴하는 것이 참 어려웠고, 더 날카롭고 디테일한 피드백이 있었으면 좋았을 것 같다는 생각이 많이 남는다. 그러나 대화를 통해 방향을 재설정하고 다시 나아간 부분에 있어선 꽤 만족하고 있다. 알고리즘 분쇄기라는 스터디를 통해 공부를 시작했고, 알고리즘과 코테에 발을 들인만큼 멈추지 않고, 계속해서 나아가는 밑거름으로 삼고 싶다.
😀 창O님 : 이번 스터디를 통해 알고리즘에 대한 이해를 크게 넓혔습니다. 이진 탐색 트리와 스택 같은 기본 개념을 잘 습득했고, 이를 활용한 문제 풀이에서 큰 성과를 느꼈습니다. 특히 연결 리스트와 회전하는 큐 문제에서 어려움을 겪었으나, 이를 해결하면서 많은 교훈을 얻었습니다. JavaScript의 제한된 기능 내에서 알고리즘을 구현하는 방법을 배우고, 빅 오 표기법을 활용한 효율적인 데이터 처리 방안을 익혔습니다. 학습 방법에서는 개념을 먼저 확립한 후, 기초 문제를 풀면서 이해를 깊이는 방식이 유효했으나, 난이도가 높은 문제에서 개념 부족을 느끼기도 했습니다. 이를 보완하기 위해 개인의 학습 속도에 맞춘 학습이 필요하다는 점을 깨달았습니다. 스터디 그룹을 통해 서로의 학습 내용을 공유하고 함께 성장하는 경험이 매우 유익했으며, 앞으로도 알고리즘을 지속적으로 학습하고 코딩 테스트 문제를 풀며 실력을 쌓아갈 계획입니다.
😗 준O님 : 이번 알고리즘 스터디를 통해 다양한 자료 구조와 알고리즘을 학습하고, 문제 해결 능력을 크게 향상시킬 수 있었습니다. 특히 트리와 그래프를 다룬 문제들, 특히 길 찾기 게임과 다단계 칫솔 판매 문제는 난이도가 높았지만 큰 도전이었습니다. 배열, 스택, 큐, 해시, 그래프 등 다양한 알고리즘을 익히며 각각의 특성을 잘 활용하는 방법을 배웠습니다. 학습 방법으로는 자바스크립트 메소드를 활용한 문제 풀이가 도움이 되었으나, 시간이 부족할 때 AI의 도움을 최소화하고 스스로 해결하려는 접근이 때로는 비효율적이었습니다. 향후에는 알고리즘을 다시 복습하고, 특히 트리와 재귀 함수에 대한 심화 공부를 진행할 예정입니다. 이 과정을 통해 얻은 경험은 향후 개발자로서 중요한 밑거름이 될 것입니다.
😊 우O님 : 이번 알고리즘 스터디를 통해 해시와 트리에 대해 깊이 있는 학습을 진행했다. 특히 해시는 key-value 구조로 문제를 해결하는 데 유용함을 깨달았고, 트리 문제는 좌우 노드 인덱스 수식을 사용한 구현을 익혔다. 어려웠던 점은 트리, 유니온-파인드, 다익스트라 알고리즘이었으며, 특히 트리순회와 이진탐색트리 구현은 직접 구현하면서 개념을 잡았다. 스터디 중 시간 분배 문제로 어려움을 겪었고, 더 효율적으로 문제를 풀기 위해 답안을 참고하거나 AI의 도움을 받는 방법을 개선해나갔다. 향후 모든 알고리즘을 다시 복습하고, 개념을 완벽히 이해할 수 있도록 복기를 할 계획이다. 스터디 초반과 달리 어려운 문제에서 해결 속도가 더뎌졌지만, 코딩 테스트를 대비해 다시 공부할 필요성을 느꼈다. 해시와 관련된 지식은 스터디를 통해 명확히 이해할 수 있었다.
😘 의O님 : 이번 알고리즘 스터디에서 집합과 트리에 대한 새로운 이해를 얻을 수 있었습니다. 특히, 집합이 배열을 활용한 트리로 구현된다는 점과 경로 압축 및 랭크 개념을 배우게 되어 인상 깊었습니다. 섬 연결하기 문제를 풀며, 처음에는 그리디 알고리즘을 적용하려 했지만, 더 효율적인 방법인 트리의 랭크와 경로 압축을 활용한 해결법을 알게 되어 유익했습니다. 어려웠던 문제는 길 찾기 게임으로, 이진 트리를 만들 때 부모와 자식 관계를 정확히 설정하는 데 어려움이 있었습니다. 해결 방법은 노드 클래스를 만들어 자식 배치를 결정하는 방식이었습니다. 스터디 방법에서는 개념을 설명하는 시간을 가지며 서로 배운 점을 공유하는 것이 큰 도움이 되었고, 문제를 풀기 전에 풀이 계획을 세우는 방식이 유효하다는 것을 깨달았습니다. 그러나 해결되지 않는 문제를 오래 붙잡기보다는 설계 단계로 돌아가 재검토하는 것이 필요함을 느꼈습니다. 향후에는 테스트 케이스 작성과 문제의 알고리즘을 파악하는 연습을 추가할 예정입니다.