프로그래밍의 기초부터 실전까지: 30일간의 DSA 도전기
2024-10-01 08:13:08소개
이번 9월, 저는 스스로 설정한 30일간의 코드 도전 과제를 시작했습니다. 매일 최소 두 개의 데이터 구조 및 알고리즘(DSA) 문제를 해결하겠다는 목표를 세우고, 프로그래밍 실력을 한 단계 끌어올리기 위해 도전하게 되었습니다. 이 과정은 저에게 단순한 문제 해결 이상의 의미를 가졌습니다. 새로운 환경에 자신을 던지고, 규칙성과 지속 가능성을 유지하며, 나아가 문제 해결 기술과 프로그래밍 논리를 향상시키고자 했습니다.
배경 및 필요성
현재의 프로그래밍 환경은 매우 빠르게 변화하고 있습니다. 따라서 고급 프로그래밍 능력을 갖추는 것은 필수적입니다. 특히 DSA는 소프트웨어 엔지니어링의 핵심 요소로, 인터뷰에서 자주 등장하는 주제입니다. 저 또한 취업 준비 과정에서 이 부분을 강화해야겠다는 필요성을 느꼈습니다. 이를 위해 여러 플랫폼을 활용해 다양한 DSA 문제를 해결하고, 프로그래밍 언어의 이해도를 높이기 위해 30일 간의 체계적인 학습 계획을 세웠습니다.
핵심 내용
이 블로그에서는 제가 30일간 진행한 DSA 도전의 핵심 내용과 학습 과정에서 발견한 몇 가지 기술을 나누고자 합니다. 다양한 데이터 구조와 알고리즘을 다루며 겪은 경험과 기술들이 어떻게 서로 연결되고, 문제 해결에 긍정적인 영향을 미쳤는지에 대해 깊이 있는 논의를 진행할 것입니다.
다양한 데이터 타입의 이해
매일 문제를 해결하면서 다양한 데이터 구조와 알고리즘을 접하게 되었습니다. 배열, 문자열, 객체, 맵, 세트, 숫자, 부울 등 기본적인 데이터 타입부터 시작하여 복잡한 연결 리스트와 이진 트리 등의 고급 구조까지 다루게 되었습니다.
한 가지 예시로, LeetCode의 30일 자바스크립트 트랙에서 배열 변환, 함수 변환, 클로저, 클래스, JSON 처리, 프로미스 및 시간 관련 문제 등을 다루며 기본 개념을 확립할 수 있었습니다. 이러한 문제들은 문제 해결 과정에서의 사고 방식을 변화시킬 수 있었습니다.
접근 방법 및 기법
점차적으로 다양한 해결 접근 방식과 문제 해결 기법을 익히게 되었습니다. 재귀, 투 포인터, 해시맵, 해시테이블, 탐욕 알고리즘, 이진 탐색, 슬라이딩 윈도우, 동적 프로그래밍, 캐싱(메모이제이션) 등 다양한 기법들이 저를 사로잡았습니다.
특히 투 포인터 접근 방식은 특정 순서가 있는 자료(예: 배열 및 문자열)를 다룰 때 매우 효과적이었습니다. 이 기법을 통해 검색 공간을 줄이고 더 효율적인 해결책을 찾을 수 있었습니다. 슬라이딩 윈도우 기법도 저에게 큰 도움이 되었으며, 서브 배열 또는 서브 문자열 문제를 해결할 때 중요한 역할을 했습니다.
동적 프로그래밍은 가장 복잡한 기법 중 하나로, 초기에는 중복 부분 문제를 인식하는 데 어려움을 느꼈습니다. 하지만 반복적인 훈련을 통해 메모이제이션의 중요성을 깨닫고 이를 효과적으로 활용할 수 있었습니다.
함수 조작 및 고급 자바스크립트 개념
기본 DSA 문제를 뛰어넘어, 자바스크립트의 고급 개념도 시도해볼 수 있었습니다. 래퍼 함수 작성 및 코드 흐름 제어를 배우며, 특정 요구 사항에 맞게 기능을 확장하는 방법을 익혔습니다. 또한 프로토타입을 활용해 데이터 타입의 기본 기능을 넘어서 제어할 수 있는 방법을 배웠습니다.
메모이제이션 기법을 통해 동일한 함수 호출에 대한 결과를 저장하여 성능을 향상시키는 방법도 배웠으며, 메모이제이션을 활용하여 메모리 효율성 측면에서도 뛰어난 성과를 거두었습니다.
예시
제가 문제를 푸는 과정에서 가장 기억에 남는 예시는 LeetCode에서 99% 메모리 효율을 기록한 메모이제이션 솔루션입니다. 이를 통해 중복 호출을 줄이고, 매번 반복적으로 계산할 필요 없이 빠른 시간에 결과를 도출해낼 수 있었습니다.
또한, HackerRank의 30일 코드 챌린지와 LeetCode의 상위 인터뷰 150 문제들을 통해 면접 준비에도 큰 도움이 되었습니다. 다양한 난이도의 문제들을 풀어가면서, 문제 접근 방식과 최적화의 중요성을 더욱 깨닫게 되었습니다.
결론
30일간의 DSA 도전은 단순한 연습이 아니라, 프로그래밍 기술 전반에 대한 깊은 통찰을 안겨준 시간でした. 다양한 데이터 구조와 알고리즘을 배우며 저의 문제 해결 기술이 한층 발전했음을 느낄 수 있었습니다. 이 과정을 통해 배운 점들을 토대로 앞으로도 지속적으로 자기 계발을 이어나갈 계획입니다. 여러분도 이런 도전을 통해 스스로의 경계를 시험해 보시길 권장합니다!