Basic/자료구조와 알고리즘 Algorithm 8

나의 알고리즘 공부 여정8 - 마지막 편, 회고

20210317_TIL 알고리즘 문제를 집중적으로 다루어 보는 기간이 끝났다. 3월 5일부터 14일간 알고리즘의 바다에 풍덩 빠져있었다. 아직 만족할 만큼 알고리즘 문제를 막힘없이 풀어내지는 못하지만, 짧은 기간안에 알고리즘을 유형별로 흩어보고 풀이 경험을 쌓을 수 있었기에 의미 있는 시간이었다. 하루 하루 문제를 풀어나가면서, '내가 늘고 있는게 맞나?'라는 생각이 드는 날들도 있었지만 3월 5일 TIL 글을 읽고 바로 깨달았다. 2주 전에 비해 알고리즘 실력이 엄청나게 늘었다는 사실을.... 입력을 어떻게 받는지도 몰랐던 내가 자료구조와 알고리즘 문제들의 유형별 풀이를 전반적으로 익히고 적용하는 수준으로 성장했다. 특히, 1주차에 이해가 안되서 그냥 넘어간 문제들을 2주차에 다시 보니 쉽게 이해가 되..

나의 알고리즘 공부 여정7 - 최적해 알고리즘

20210317_TIL 동적계획법(이하 DP), 분할정복, 그리디 알고리즘 문제들을 풀었다. 상황별로 그에 맞는 최적해 알고리즘을 적용해보면서, 최적해 알고리즘을 잘 풀기 위한 경험을 쌓았다. 최적해 알고리즘 문제들을 여러 유형 접해보며, DP적 사고, 분할정복적 사고, 그리디 알고리즘적 사고 등을 연습 중이다. 상황별로 '최적'의 값을 도출해야하기 때문에 이전에 소개했던 탐색 알고리즘보다 문제가 조금 까다로운 측면이 있다. 최적의 값을 도출하기 위해 고려해야 할 상황들을 구성하고, 그 상황 별로 도출되는 결과값들을 모두 계산해야 하기 때문이다. 1. 최적해 알고리즘 분류 오늘 소개할 알고리즘은 최적해 알고리즘이다. 이름 그대로 '최적값'을 도출할 때 쓴다. 최적해 알고리즘 종류는 다음과 같다. 모든 상..

나의 알고리즘 공부 여정6 - 탐색 알고리즘, 코드 기능과 형태 개선

20210315_TIL 한층 심화된 알고리즘 문제들을 풀어나가며 기존에 알았던 자료구조, 알고리즘 개념을 좀 더 세부적이고 깊이 알 수 있었다. 특히 탐색 알고리즘 관련한 학습을 많이 진행했다. 팀원분과 코드 리뷰를 진행하면서, 시간 복잡도 낮추기와 같은 기능적 측면의 코드 개선뿐만 아니라 가독성과 같은 형태적 측면의 코드 개선을 생각해보기 시작했다. 결국, 협업을 위해서는 가독성 좋은 코드가 중요하고 형태적 측면의 코드 개선 역시 충분히 중요하게 고려해 보아야 하는 문제다. 1. 탐색 알고리즘 알고리즘에는 많은 종류가 있지만, 그 중에서도 정렬 알고리즘과 탐색 알고리즘이 가장 대표적이다. 오늘은 탐색 알고리즘에 대해 다뤄보고자 한다. 탐색 알고리즘은 알고리즘 문제 풀이에 참 많이 사용된다. 탐색 알고리..

나의 알고리즘 공부 여정5 - 시간 복잡도, 코드 효율화

20210312_TIL 알고리즘 개념 학습 기간이 끝났다. 이제 하~중 난이도의 알고리즘 문제들을 양치기(?) 하는 기간이다. 오늘은 어제, 그제 풀었던 문제 대비 쉬운 문제들을 풀었다. 대신, 지난주 하루 평균 3~4문제들을 푼 것과 달리 오늘은 7문제나 풀었다. 지난 주에 학습을 완료한 개념들을 많이 많이 응용해보는 기간이라 생각하면 될 듯하다. 기본이 되는 개념학습이 거의 완료되어 있어서 그런지, 지난 주 대비 난이도 하 알고리즘 문제를 푸는 시간이 매우매우 단축되었다. 그러다 보니 자연스럽게 코드 효율화에 대한 고민이 깊어졌다. 이제 난이도 하 문제는 답을 못맞출 일은 없다. 이 다음에 필요한 것은 효율화다. 어떻게 하면 시간복잡도를 줄일 수 있는지, for 문 중첩을 최대한 안쓸 수 있는지에 대..

나의 알고리즘 공부 여정4 - DFS, BFS, Dynamic Programming, 유형별 개념 적용

20210311_TIL 난이도 중 ~ 중하의 알고리즘 문제에서 중요한 것은 문제별로 어떤 자료구조와 알고리즘을 적용할 것인지 판단하는 것이다. 판단이 맞다면, 선정한 자료구조와 알고리즘이 가장 일반적으로 사용하는 코드 구조와 코드가 크게 달라지지 않는다는 것을 문제풀이를 통해 알게 되었다. 어제 발견한 점은, 문제가 달라도 동일한 자료구조, 알고리즘을 적용하는 문제는 코드가 비슷하다는 사실이었다. 그래서 오늘은 문제에 어떤 자료구조와 알고리즘을 적용하겠다는 판단이 서면 해당 자료구조, 알고리즘의 코드 구조를 거의 유사하게 가져와 적용해봤다. 덕분에 빠른 시간 안에 문제를 해결할 수 있었다. 다만 난이도 중상 이상의 알고리즘 문제는 위의 방법대로 자료구조, 알고리즘의 코드 구조를 그대로 적용해 해결할 수 ..

나의 알고리즘 공부 여정3 - 스택과 큐, 풀이의 유사성

20210310_TIL 스택, 큐 관련 백준 알고리즘 문제를 풀면서 경험을 쌓았다. 스택, 큐 개념은 이틀 전 밤에 강의를 들으면서 익혀놨던 터라 개념을 알고는 있었는데 관련 문제를 푸는 건 처음이었다. 따라서 어떻게 관련 method들을 적용하여 구현해야 할 지 감이 안와서 내가 짠 코드들이 매우 마음에 안들었다. 스택 자료구조관련 method들을 완벽하게 응용해 풀지 못했다. 그래서 든 생각인데 난이도 있는 개념을 공부한 후 관련 문제 풀이를 '처음할 때'에는, 2시간 정도 고민 후 모범 답안 풀이를 보고 풀이를 익히는 방법이 효율적일 것 같다. 개념을 모범적으로 구현한 풀이를 익히면, 다음에 동일 개념 다른 문제를 풀 때 코드가 좀 더 나아질 테니 말이다. 마침 오늘 스택 관련 문제를 두 개나 풀었..

나의 알고리즘 공부 여정2 - 자료구조, 알고리즘, 재귀, 정렬, 이분탐색

20210309_TIL 어제 정리한 자료구조, 알고리즘, 프로그래밍 언어라는 큰 틀에서 알고리즘 문제를 바라보는 시도를 했다. 하단 오늘 푼 문제 설명에 이 관점을 적용해 보았다. 재귀 함수, 정렬, 이분탐색 관련한 백준 문제들을 풀며 관련 개념을 익혔다. 아주 어려운 개념이 아닌 이상 문제에서 요구하는 코드의 80% 정도는 구현이 가능한 수준이 되었다. 이게 가능한 이유는 두 가지가 있을 것 같다. 1) 입력과 출력 관련한 코드 구현 기술이 익숙해졌다. 2) 자료구조, 알고리즘, 프로그래밍 언어라는 큰 틀 안에서 관련 정보들을 정리하는 작업을 진행했었다. 덕분에 문제를 읽고 자료구조와 알고리즘을 선택하고, 이를 구현하기 위한 파이썬 언어 정보를 찾아보는 과정에 체계(?) 비스무리한 것이 생겼기 때문인 ..

나의 알고리즘 공부 여정1 - 우리는 왜 알고리즘을 공부하는가?

20210308_TIL 금, 토, 월 3일간 백준 알고리즘 문제들을 풀어나가며, 문제풀이에 필요한 개념들을 구글링해 공부했다. 그때 그때 필요한 자료들을 찾아 공부하며 머릿 속에 쌓은 파편적인 지식들을 파이썬 문법, 자료구조, 알고리즘이라는 큰 구조에 분류해 집어넣는 작업을 진행했다. 머릿속에 굴러다녔던 정보들이 좀 정리가 된 기분이다. 0. 선 문풀 후 개념정리 지난 주 금, 토 그리고 오늘까지 3일간 백준 알고리즘 문제를 풀었다. 노베이스이지만, 문제를 풀기위해 문제풀이에 필요한 개념들을 하나 하나 검색하며 문제를 풀었다. 직접적인 풀이를 검색한 것은 아니다. 내가 했던 검색 방법의 예를 들면, "알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램..