2023. 2. 10. 19:19ㆍAlgorithm
정말 오랜만에 작성하는 블로그 글이다.
우선 핑계를 대고 시작을 하자면, 그동안 군대 막사 이동, 사이버 지식 정보방의 공사, 바쁜 분대장의 업무 등으로.. 컴퓨터를 만질 수 없는 상황이 계속되다 보니 군대 안에서도 블로그 유지와 알고리즘 공부 등 여러 공부를 하겠다는 나의 계획은 처참히(?) 무너졌었다..
아무리 그래도 그렇지.
'정말 아무런 공부도 할 수 없는 상황이었을까'라고 묻는다면 그건 아니다. 그동안 나 자신도 많이 나태해졌었고,,, 방법을 바꾸면 충분히 할 수 있는 상황임에도 불구하고 그런 노력조차 하지 않았기 때문에 늦게 오게 된 것이 아닐까 한다.
아무튼 작년에 내가 하고자 했던 것은 책 "파이썬 알고리즘 인터뷰"라는 책을 구매하고,
이 안에 수록되어 있는 95문제를 꾸준히 풀어서 블로그에 나의 언어로 재해석해서 이해한 내용을 포스트 하는 것이었다.
왜 기존 계획은 실패했을까?
가장 큰 문제는 나의 수준을 고려하지 못한 채로 다른 사람들의 평만을 듣고 계획을 짰기 때문이라고 생각한다.
'파이썬 알고리즘 인터뷰' 책 초반까지만 보았을 때는 입문자용으로 손색이 없을 정도로 이해하는데 문제가 없었다고 느꼈었다. 하지만, 계속 문제를 풀어가다 보니 기본적으로 알아야 하는 알고리즘 지식들, 그리고 파이썬을 능숙하게 다룰 수 있는 숙련도가 어느 정도 갖춰졌을 때 더 효과적으로 풀 수 있을 것 같았다.
약간 한계가 느껴졌다고 할까.. 그 한계를 느끼게 되니 문제를 푸는 것 자체가 재미가 없어지게 됐다..
즉, 다시 말해 예전 수학 문제를 풀었던 것과 마찬가지로 생각만 해서 풀 수 있는 것이 아니라,
그 문제를 풀기 위한 "생각의 재료"가 어느 정도 갖춰져 있을 때 나도 더 다양하게 생각하고 문제의 의도에 맞는 생각을 할 수 있는 것이었다.
둘째는 확실한 동기부여가 없었다는 것이다.
나중에 전공수업 때 들어야 하는 건 맞긴 하는데... 지금부터 공부를 한다고 별로 코딩 실력이 느는 것 같지도 않다는 생각과,
차라리 이 알고리즘을 공부할 시간에 iOS 지식이나 하나 더 봐야 하는 거 아닌가,,, 아니면 백엔드 공부라도 해서 어플을 만들 수 있는 스킬을 갖춰야 하는 거 아닌가,, 하는 다른 생각이 계속 머릿속에 떠올랐던 것 같다.
그러니 하나를 계속 꾸준히 하지 못하고, 이거 했다가 저거 했다가 시간만 흘려보내던 나날이 많았었다 그동안.
마지막은 내가 사회에서 공부했던 시간과 군대에서 공부해야 하는 시간의 차이를 반영하지 못했다는 것이다.
사회에 있었을 때는 맥북이라는 도구, 모니터라는 큰 화면, 여유로운 시간과 환경이 있었지만 군대 공부 환경은 이와는 많이 달랐다.
우선 애초에 나에게 주어진 절대적인 공부 시간은 부족했으며,
컴퓨터의 사용조차도 자유롭지 않아 때로는 핸드폰 키보드로 혹은 말 그대로 손 코딩으로만 문제를 풀기가 대다수였다.
이런 환경 속에 적응을 해야 하는 건 군대가 아니라 나 자신이었다.
이런 환경을 불평하기보다는 그에 맞춰서 어떻게 공부를 해야 할지를 우선적으로 생각했어야 했다. 어차피 흐르는 건 시간이었으니.
2023년을 맞아 다시 원점에서 공부 계획을 생각하며,
내가 2022년에는 왜 목표를 제대로 달성하지 못했는지, 어떤 점들이 문제였는지를 우선적으로 파악했다.
그리고 다시 공부 계획을 짤 때는 같은 실수를 절대 반복하지 말자고 나 스스로 다짐했다.
그래서 어떻게 공부해야 할까?
결국은 알고리즘 공부 계획을 원점에서 생각해 다시 짰다.
이때, 다른 사람들의 의견들을 참고하되, 말 그대로 정말 "참고"만 했다.
여러 알고리즘 학습 커리큘럼, 가이드 글들과 영상을 많이 봐왔지만 결국은 내 수준에 맞춰, 내 상황에 맞춰 내가 감당할 수 있는 공부를 해야 한다는 것이 가장 중요하게 느낀 부분이어서 이에 맞춰 조금 세부적이고 단계를 낮춰 초보자 기준으로 목표를 다시 설정했다.
총 5단계의 계획을 설정했으며, 다시 말하지만 오로지 내 기준으로 세운 계획이라 난이도가 너무 낮다고 느낄 수도 있겠다.
- (기초 다지기) 파이썬 기본문법 복습, 알고리즘 기본 내용 공부 [완료]
- (흥미 붙이기) 프로그래머스 코딩테스트 입문 - Level. 0 100문제 풀기 [완료]
- (습관 만들기) 매일 알고리즘 한 문제씩 풀기(프로그래머스 Lv 1~3 & 백준) -> 실천중
- (심화) '파이썬 알고리즘 인터뷰' 책 완독하기, 프로그래머스 코딩테스트 고득점 Kit 풀기 -> 진행중
- (응용) 프로그래머스 카카오 코딩 테스트 문제 풀기, 과제 테스트 연습, Swift까지 확장
또한, 절대 나 스스로 한 문제를 해결하기 전까지는 정답은 보지 않기로 한다.
예전 수학 공부를 했던 것과 마찬가지로 최대 30분까지 한 문제를 도전하고, 풀리지 않는다면 다음 문제로 넘어간다.
풀지 못한 문제는 다음날 또 다음날까지 계속 풀릴 때까지 계속 도전하기로 나 스스로 정했다.
1단계. 알고리즘 기초 다지기: 파이썬 기본문법 복습 [완료], 알고리즘 기본 내용 공부 [완료]
(알고리즘에서 자주 쓰는 파이썬 문법)
예전에 정리해 둔 Pythonic Code의 내용을 많이 참고했다.
알고리즘 언어로 파이썬을 선택한 이상, 파이썬의 특성과 기능을 적극 활용해 주는 것이 알맞은 도리이다.
아래 글을 읽고 기본적인 파이썬의 특성을 이해해 보자.
(알고리즘 기본 내용)
1. 연결 리스트(Linked List) 기본 내용 정리
2. 트리(Tree), 힙(Heap) 기본 내용 정리
3. 스택(Stack), 큐(Queue) 기본 내용 정리
4. 그래프, BFS, DFS 기본 내용 정리
2단계. 알고리즘 흥미 붙이기: 프로그래머스 코딩테스트 입문 100문제 [완료]
입문용으로 정말 많은 정보를 찾아봤는데, 나에게는 프로그래머스가 딱 좋은 환경이더라.
프로그래머스 코딩테스트 입문으로 되어있는 Level 0의 100문제를 매일 꾸준히 풀면서, 스탬프를 꽉 채워보자.
나도 모르게 코드를 적는 내 자신의 모습이 익숙해질 거다.
하루 4문제를 기준으로 25일 동안 꾸준히 풀면 100문제를 마스터할 수 있으며, 모든 문제를 해결하면 머쓱이 스탬프도 얻을 수 있다 :)
2023.02.25 기준, 100문제를 모두 해결했다.
2023.06.07 기준, 25일치 모든 글을 작성해서 업로드했다. (문제 풀이는 아래 표 링크를 클릭하면 확인할 수 있다!)
Day 1. 사칙연산 | 두 수의 합 | 두 수의 차 | 두 수의 곱 | 몫 구하기 | |
Day 2. 사칙연산, 조건문, 배열 | 두 수의 나눗셈 | 숫자 비교하기 | 분수의 덧셈 | 배열 두 배 만들기 | |
Day 3. 사칙연산, 배열, 수학 | 나머지 구하기 | 중앙값 구하기 | 최빈값 구하기 | 짝수는 싫어요 | |
Day 4. 수학, 배열 | 피자 나눠 먹기 (1) | 피자 나눠 먹기 (2) | 피자 나눠 먹기 (3) | 배열의 평균값 | |
Day 5. 수학, 배열 | 옷가게 할인 받기 | 아이스 아메리카노 | 나이 출력 | 배열 뒤집기 | |
Day 6. 문자열, 반복문, 출력, 배열, 조건문 | 문자열 뒤집기 | 직각삼각형 출력하기 | 짝수 홀수 개수 | 문자 반복 출력하기 | |
Day 7. 문자열, 조건문, 수학, 반복문 | 특정 문자 제거하기 | 각도기 | 양꼬치 | 짝수의 합 | |
Day 8. 배열, 구현, 수학 | 배열 자르기 | 외계행성의 나이 | 진료순서 정하기 | 순서쌍의 개수 | |
Day 9. 수학, 문자열, 해시, 완전탐색, 조건문 | 개미 군단 | 모스부호 (1) | 가위 바위 보 | 구슬을 나누는 경우의 수 | |
Day 10. 조건문, 배열, 수학, 시뮬레이션 | 점의 위치 구하기 | 2차원으로 만들기 | 공 던지기 | 배열 회전시키기 | |
Day 11. 수학, 반복문 | 주사위의 개수 | 합성수 찾기 | 최대값 만들기 (1) | 팩토리얼 | |
Day 12. 문자열, 정렬, 사칙연산, 수학 | 모음 제거 | 문자열 정렬하기 (1) | 숨어있는 숫자의 덧셈 (1) | 소인수분해 | |
Day 13. 문자열, 배열, 사칙연산, 수학, 조건문 | 컨트롤 제트 | 배열 원소의 길이 | 중복된 문자 제거 | 삼각형의 완성조건 (1) | |
Day 14. 조건문, 반복문, 시뮬레이션, 문자열 | 가까운 수 | 369게임 | 암호 해독 | 대문자와 소문자 | |
Day 15. 문자열, 해시, 배열, 수학 | 영어가 싫어요 | 인덱스 바꾸기 | 한 번만 등장한 문자 | 약수 구하기 | |
Day 16. 문자열, 수학, 배열, 조건문 | 편지 | 가장 큰 수 찾기 | 문자열 계산하기 | 배열의 유사도 | |
Day 17. 문자열, 수학, 조건문, 배열, 사칙연산 | 숫자 찾기 | n의 배수 고르기 | 자릿수 더하기 | OX퀴즈 | |
Day 18. 문자열, 수학, 조건문, 정렬 | 문자열안에 문자열 | 제곱수 판별하기 | 세균 증식 | 문자열 정렬하기 (2) | |
Day 19. 문자열, 배열, 조건문 | 7의 개수 | 잘라서 배열로 저장하기 | 중복된 숫자 개수 | 머쓱이보다 키 큰 사람 | |
Day 20. 수학, 시뮬레이션, 문자열, 사칙연산 | 직사각형 넓이 구하기 | 캐릭터의 좌표 | 최댓값 만들기 (2) | 다항식 더하기 | |
Day 21. 문자열, 사칙연산, 시뮬레이션, 2차원배열, 수학, 배열 | 숨어있는 숫자의 덧셈 (2) | 안전지대 | 삼각형의 완성조건 (2) | 외계어 사전 | |
Day 22. dp, 수학, 조건문, 배열 | 저주의 숫자 3 | 평행 | 겹치는 선분의 길이 | 유한소수 판별하기 | |
Day 23. 배열, 정렬, 문자열 | 특이한 정렬 | 등수 매기기 | 옹알이 (1) | 로그인 성공? | |
Day 24. 수학, 시뮬레이션, 문자열, 조건문, 반복문 | 치킨 쿠폰 | 이진수 더하기 | A로 B 만들기 | k의 개수 | |
Day 25. 시뮬레이션, 조건문, 수학 | 문자열 밀기 | 종이 자르기 | 연속된 수의 합 | 다음에 올 숫자 |
3단계. 알고리즘 습관 만들기: 매일 알고리즘 한 문제씩 풀기 (프로그래머스 Lv 1~3 & 백준) [실천중]
이제 기본적인 알고리즘 내용은 어느 정도 숙지했으니, 알고리즘 문제풀이를 내 습관으로 만들 차례이다.
우선, 매일매일 프로그래머스에 있는 Lv 1에서 3 사이의 문제들을 위주로 풀어줄 거다.
이 문제 풀이 내용들은 모두 글을 올리지는 않고, 조금 주요한 내용이나 정리가 필요한 문제에 한해서만 글을 올리도록 하겠다.
아래 깃허브 레포에서 알고리즘 풀이와, 해설글을 함께 확인할 수 있도록 정리하는 중이다!
4단계. '파이썬 알고리즘 인터뷰' 책 완독하기 [진행중] , 프로그래머스 고득점 Kit 문제 풀기 [진행중]
프로그래머스에 고득점 Kit라는 파트로 주요한 문제들을 따로 정리한 부분이 있어 이 부분을 풀어보려고 한다.
해시, 스택/큐, 힙(Heap), 정렬, 완전탐색, 탐욕법(Greedy), 동적계획법, 깊이/너비 우선 탐색(DFS/BFS), 이분탐색, 그래프 파트로 크게 나누어져 있어 분야별로 이론 내용과 문제 풀이를 함께 정리해 볼 계획이다.
그리고 이어서, 작년에 샀던 "파이썬 알고리즘 인터뷰"에 수록된 문제들도 함께 풀 계획이다.
이 문제들은 모두 블로그에 정리해서 업로드할 예정이며, 책에 함께 수록되어 있는 알고리즘 이론과 관련된 내용들도 "내가 보려고 정리하는~" 시리즈의 글로 함께 올리도록 하겠다.
(일단, 고득점 Kit를 먼저 학기 중에 해결하고, 겨울방학 때 목표로 완독할 계획이다.)
왼쪽 문제를 누르면 풀이 글로 연결되며, 오른쪽은 문제와 함께 설명한 이론적 내용들을 확인할 수 있다.
6장. 문자열 조작 | |
문제 01. 유효한 팰린드롬 (LC 125. Valid Palindrome) | 팰린드롬의 정의, filter 함수 |
문제 02. 문자열 뒤집기 (LC 344. Reverse String) | reverse 함수 |
문제 03. 로그 파일 재정렬 (LC 937. Reorder Log Files) | lambda 표현식 |
문제 04. 가장 흔한 단어 (LC 819. Most Common Word) | 구두점 제거 re.sub 메서드 |
문제 05. 그룹 애너그램 (LC 49. Group Anagrams) | |
문제 06. 가장 긴 팰린드롬 부분 문자열 (LC 5. Longest Palindrome Substring) | |
7장. 배열 | |
문제 07. 두 수의 합 (LC 1. Two Sum) | |
문제 08. 빗물 트래핑 (LC 42. Trapping Rain Water) | |
문제 09. 세 수의 합 (LC 15. 3Sum) | |
문제 10. 배열 파티션 1 (LC 561. Array Partition 1) | |
문제 11. 자신을 제외한 배열의 곱 (LC 238. Product of Array Except Self) | |
문제 12. 주식을 사고팔기 가장 좋은 시점 (LC 121. Best Time to Buy and Sell Stock) | |
8장. 연결 리스트 | |
문제 13. 팰린드롬 연결 리스트 (LC 234. Palindrome Linked List) | |
문제 14. 두 정렬 리스트의 병합 (LC 21. Merge Two Sorted Lists) | |
문제 15. 역순 연결 리스트 (LC 206. Reverse Linked List) | |
문제 16. 두 수의 덧셈 (LC 2. Add Two Numbers) | |
문제 17. 페어의 노드 스왑 (LC 24. Swap Nodes in Pairs) | |
문제 18. 홀짝 연결 리스트 (LC 328. Odd Even Linked List) | |
문제 19. 역순 연결 리스트 2 (LC 92. Reverse Linked List 2) | |
9장. 스택, 큐 | |
문제 20. 유효한 괄호 (LC 20. Valid Parentheses) | |
문제 21. 중복 문자 제거 (LC 316. Remove Duplicate Letters) | |
문제 22. 일일 온도 (LC 739. Daily Temperatures) | |
문제 23. 큐를 이용한 스택 구현 (LC 225. Implement Stack using Queues) | |
문제 24. 스택을 이용한 큐 구현 (LC 232. Implement Queue using Stacks) | |
문제 25. 원형 큐 디자인 (LC 622. Design Circular Queue) | |
10장. 데크, 우선순위 큐 | |
문제 26. 원형 데크 디자인 (LC 641. Design Circular Deque) | |
문제 27. k개 정렬 리스트 병합 (LC 23. Merge k Sorted Lists) | |
11장. 해시 테이블 | |
문제 28. 해시맵 디자인 (LC 706. Design HashMap) | |
문제 29. 보석과 돌 (LC 771. Jewels and Stones) | |
문제 30. 중복 문자 없는 가장 긴 부분 문자열 (LC 3. Longest Substring Without Repeating Characters) | |
문제 31. 상위 K 빈도 요소 (LC 347. Top K Frequent Elements) | |
12장. 그래프 | |
문제 32. 섬의 개수 (LC 200. Number of Islands) | |
문제 33. 전화 번호 문자 조합 (LC 17. Letter Combinations of a Phone Number) | |
문제 34. 순열 (LC 46. Permutations) | |
문제 35. 조합 (LC 77. Combinations) | |
문제 36. 조합의 합 (LC Combination Sum) | |
문제 37. 부분 집합 (LC 78. Subsets) | |
문제 38. 일정 재구성 (LC 332. Reconstruct Itinerary) | |
문제 39. 코드 스케줄 (LC 207. Course Schedule) | |
13장. 최단 경로 문제 | |
문제 40. 네트워크 딜레이 타임 (LC 743. Network Delay Time) | |
문제 41. K 경유지 내 가장 저렴한 항공권 (LC 787. Cheapest Flights Within K Stops) | |
14장. 트리 | |
문제 42. 이진 트리의 최대 깊이 (LC 49. Group Anagrams) | |
문제 43. 이진 트리의 직경 (LC 49. Group Anagrams) | |
문제 44. 가장 긴 동일 값의 경로 (LC 49. Group Anagrams) | |
문제 45. 이진 트리 반전 (LC 49. Group Anagrams) | |
문제 46. 두 이진 트리 병합 (LC 49. Group Anagrams) | |
문제 47. 이진 트리 직렬화 & 역직렬화 (LC 49. Group Anagrams) | |
문제 48. 균형 이진 트리 (LC 49. Group Anagrams) | |
문제 49. 최소 높이 트리 (LC 49. Group Anagrams) | |
문제 50. 정렬된 배열의 이진 탐색 트리 변환 (LC 49. Group Anagrams) | |
문제 51. 이진 탐색 트리(BST)를 더 큰 수 합계 트리로 (LC 49. Group Anagrams) | |
문제 52. 이진 탐색 트리(BST) 합의 범위 (LC 49. Group Anagrams) | |
문제 53. 이진 탐색 트리(BST) 노드 간 최소 거리 (LC 49. Group Anagrams) | |
문제 54. 전위, 중위 순회 결과로 이진 트리 구축 (LC 49. Group Anagrams) | |
15장. 힙 | |
문제 55. 배열의 K번째 큰 요소 (LC 49. Group Anagrams) | |
16장. 트라이 | |
문제 56. 트라이 구현 (LC 49. Group Anagrams) | |
문제 57. 팰린드롬 페어 (LC 49. Group Anagrams) | |
17장. 정렬 | |
문제 58. 리스트 정렬 (LC 49. Group Anagrams) | |
문제 59. 구간 병합 (LC 49. Group Anagrams) | |
문제 60. 삽입 정렬 리스트 (LC 49. Group Anagrams) | |
문제 61. 가장 큰 수 (LC 49. Group Anagrams) | |
문제 62. 유효한 애너그램 (LC 49. Group Anagrams) | |
문제 63. 색 정렬 (LC 49. Group Anagrams) | |
문제 64. 원점에 K번째로 가까운 점 (LC 49. Group Anagrams) | |
18장. 이진 검색 | |
문제 65. 이진 검색 (LC 49. Group Anagrams) | |
문제 66. 회전 정렬된 배열 검색 (LC 49. Group Anagrams) | |
문제 67. 두 배열의 교집합 (LC 49. Group Anagrams) | |
문제 68. 두 수의 합 2 (LC 49. Group Anagrams) | |
문제 69. 2D 행렬 검색 2 (LC 49. Group Anagrams) | |
19장. 비트 조작 | |
문제 70. 싱글 넘버 (LC 49. Group Anagrams) | |
문제 71. 해밍 거리 (LC 49. Group Anagrams) | |
문제 72. 두 정수의 합 (LC 49. Group Anagrams) | |
문제 73. UTF-8 검증 (LC 49. Group Anagrams) | |
문제 74. 1비트의 개수 (LC 49. Group Anagrams) | |
20장. 슬라이딩 윈도우 | |
문제 75. 최대 슬라이딩 윈도우 (LC 49. Group Anagrams) | |
문제 76. 부분 문자열이 포함된 최소 윈도우 (LC 49. Group Anagrams) | |
문제 77. 가장 긴 반복 문자 대체 (LC 49. Group Anagrams) | |
21장. 그리디 알고리즘 | |
문제 78. 주식을 사고팔기 가장 좋은 시점 2 (LC 49. Group Anagrams) | |
문제 79. 키에 따른 대기열 재구성 (LC 49. Group Anagrams) | |
문제 80. 태스크 스케줄러 (LC 49. Group Anagrams) | |
문제 81. 주유소 (LC 49. Group Anagrams) | |
문제 82. 쿠키 부여 (LC 49. Group Anagrams) | |
22장. 분할 정복 | |
문제 83. 과반수 엘리먼트 (LC 49. Group Anagrams) | |
문제 84. 괄호를 삽입하는 여러 가지 방법 (LC 49. Group Anagrams) | |
23장. 다이나믹 프로그래밍 | |
문제 85. 피보나치 수 (LC 49. Group Anagrams) | |
문제 86. 최대 서브 배열 (LC 49. Group Anagrams) | |
문제 87. 계단 오르기 (LC 49. Group Anagrams) | |
문제 88. 집 도둑 (LC 49. Group Anagrams) |
23.09.17 최신
아래 내용은 계속 업데이트됩니다 ^__^ 기다려보세요 ~~
'Algorithm' 카테고리의 다른 글
[Programmers/Lv. 0] 코딩테스트 입문 Day 4 - 수학, 배열 (Python) (0) | 2023.03.11 |
---|---|
[Programmers/Lv. 0] 코딩테스트 입문 Day 3 - 사칙연산, 배열, 수학 (Python) (0) | 2023.02.16 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 2 - 사칙연산, 조건문, 배열 (Python) (0) | 2023.02.15 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 1 - 사칙연산 (Python) (0) | 2023.02.11 |
[Algorithm] 내가 보려고 정리하는 파이썬 연결 리스트(Linked List) 기초 (2) | 2022.06.06 |