Cocoball Study🍪
코딩테스트를 위한 알고리즘 개념정리, 예제문제 풀이파일 관리하는 레포지토리입니다.
📎알고리즘 : 총 8가지 (한 알고리즘 당 2주) 그리디, 구현, Dfs/bfs, 정렬, 이진탐색, 다이나믹, 최단경로, 그래프이론
날짜 | Week | 개념 | 내용 |
---|---|---|---|
2022.09.17 | 1주차 | 그리디 | 이코테 chap03 (p.85~102) 개념정리, 기본예제 풀이 |
2022.09.21 | 2주차 | 그리디 | 1931. 회의실 배정(공통문제) + 2문제 |
2022.09.28 | 3주차 | 구현 | 이코테 chap04 (p.101~119) 개념정리, 기본예제 풀이 |
21608 상어 초등학교, 12933 오리, 20291 파일 정리 |
프로그래머스 https://programmers.co.kr/learn/challenges
백준 https://www.acmicpc.net/problem/tags
CodeUp https://codeup.kr/
Codility https://app.codility.com/programmers/
온코더 https://www.oncoder.com/
구름 https://codingtest.goorm.io/
박트리님 PS공부법 https://baactree.tistory.com/52
언어선택 https://www.acmicpc.net/board/view/24568
-
구현력
- 본인이 생각한 알고리즘을 그대로 소스코드로 구현하는 능력
- 프로그램 순서도, 사용할 변수나 함수의 데이터 타입 등을 올바르게 정하는 과정
- 이 스킬을 향상시키려면 어떤 프로그램을 만들고자 하는지를 명확히 해야한다
- 무엇을 입력받아 어디에 저장하고 어떤 과정을 거쳐 중간 결과로 무엇을 얻고 최종적으로 어떤 결과물을 출력하는지 순서도를 적은 후 데이터 타입 또는 자료구조에 저장할지 생각하는 연습을 하자.
-
문제해결능력
- 알고있는 알고리즘, 자료구조, 테크닉을 당면한 문제에 맞게 변형 적용하는 것
- 문제를 창의적인 시각에서 접근해 해결하는 능력이 필요
- 중위권에서 상위권으로 갈 때 발목잡는 스킬
- 이 능력이 부족하면 어떻게 접근해야 할지, 막상 솔루션은 내가 아는 알고리즘,자료구조 인 상황이 연출된다
- 이 스킬을 향상시키려면 양질의 문제를 풀기, 이전에 본인이 접근한 다양한 방법을 잘 정리 해두는 것이 좋다
-
배경지식
- 기초적인 프로그래밍 문법, 알고리즘, 자료구조, 선형대수나 확률 등 기본적인 수학적 지식 (가끔 하드웨어, OS 지식)
- 이 능력이 부족하면 솔루션을 열었을때 외계어를 마주하게 된다.
-
정해진 시간내에 문제풀때 문제 이해시간/풀이 생각시간/코딩시간/디버깅시간을 기록하며 어떤 부분이 구체적으로 부족한지 인지해서 부족한 부분에 더 노력을 들이기로
- 알고리즘 관련 이론을 공부해 이해한다.
- 자신이 이해할 수 있는 방식으로 이론을 정리하자.
- 블로그나 깃허브에 정리하는것도 하나의 방법이 될 수 있다.
- 이론과 관련된 알고리즘 문제를 푼다.
- ex) 해쉬를 이용하는 문제, 배열을 이용하는 문제
- 문제의 레벨이나 자신의 눈높이에 맞추어 적당한 시간을 정해놓고 푼다.
- 난이도에 따라 60분~120분이 적당하다. (2시간 이상 넘기지 않는다)
- 시간을 점점 단축시키는 방향으로 공부해야 실전에 대비할 수 있다.
- 이해하기 어려운 문제는 질문하거나 풀이를 본다.
- 주어진 문제를 풀다가 어디에서 막혔는지 혹은 자신이 무엇을 모르고 있는지 명확히 알아야 해법이 가능하다.
- 관련된 이론 참고하기, 정답 소스 보기, 다른 사람들 풀이 보기
- 이해하기 힘든건 주위 사람들 혹은 깃허브에 issue를 등록하거나 pull request를 날려서 질문하자
- 쉬운것같은 문제도 괜찮으니 망설이지 말고 질문하자. 지혜를 모으면 더 좋은 솔루션을 발견.
- 알고리즘을 이해하고 다시 푼다.
- 피드백을 적용해서 코드를 수정한다.
- 상대방에게 받은 피드백과 코드에 자신이 적용한 해결방법을 정리해서 README.md에 작성하고 source/해당 코드가 있는 폴더에 업로드한다.
- 코드에 주석을 달면 시간이 지나고 다시 볼 때 빠른 이해에 도움이 된다.
* 반드시 지키는것 보단 자신에게 맞는 공부법을 찾아가자
-
월요일마다 팀 공통문제 출제
- ex) 구현력 문제 + DP 문제
-
시간 정해두고 문제풀기
- 시험 실전대비를 위해 시간을 정해두고 푸는것을 권장 (최대2시간)
-
문제풀이 마크다운 작성후 업로드하기. (개인폴더에 작업후 master branch에 merge)
- 문제풀이 양식
- 메세지 컨벤션
- 예시: lee님 백준문제 1149 풀이
- 개인적으로 푼 문제를 업로드해도 좋습니다.
- 팀원들과 공유하는 이론이나 알고리즘 정리를 업로드해도 좋습니다. 예시: ohhako님 DP정리
- 폴더설명 참고
-
주말에 온라인 피드백 진행. 약 2시간이 소요됩니다.
-
모든 질문은 slack, issue, pull request 등 자유롭게 진행됩니다.
- 주 1회 스터디룸이나 카페에서 만나 약 2~3시간 진행한다.
- 팀원들에게 자신이 공부한 이론이나 직접 푼 문제를 설명한다.
- 이때 팀원들의 도움 혹은 피드백이 필요하다면 정리해서 미리 issue 혹은 Pull Request를 날린 후 단톡에 언급
- 팀원들은 반드시 미팅 전까지 질문 내용과 답변 숙지하기.
- 미팅이 끝나고 각자 위의 4번, 알고리즘을 이해하고 다시 푼다 를 진행한다.
- contents: 공동폴더. 알고리즘 관련 이론을 정리해서 업로드하는 폴더
- source: 개인 폴더. 필요한 개인폴더를 생성하고 알고리즘 풀이를 업로드하는 폴더
git clone https://github.com/TheCopiens/algorithm-study.git
local workspace에 'ohhako'라는 이름으로 브랜치 생성
git branch ohhako
로컬 브랜치가 있는 폴더에서 개인작업을 마친 후 공동 저장소에 반영한다.
git checkout ohhako
- master에서 ohhako 브랜치로 전환- workspace에서 작업
git commit -m "message"
git push origin ohhako
- 원격저장소 ohhako 브랜치에 반영git checkout master
- 브랜치 전환git pull
- 원격저장소 master의 최신 정보를 로컬에 업데이트 시키기git merge ohhako
- master에 ohhako 브랜치 작업 반영git push origin master
- 원격저장소 master에 반영
여기에서는 각 알고리즘 개념을 설명하는 것이 없습니다. 알고리즘 설명 링크 모음
문제 뽑은 기준 : 각 태그에 해당하는 문제(코딩 테스트에 나올 정도) 들을 최대한 많이 뽑고 반드시 풀고 넘어가면 좋은 문제를 체크해놨습니다.
꼭 전부 풀 필요는 없습니다! 각 주차마다 자신이 풀 수 있는 만큼 풀어오시면 됩니다!
순서는 대략적으로 짜봤습니다. 처음이신 분들은 수학 그리고 문자열부터 푸시면 더 수월하게 알고리즘에 익숙해지실 것 같습니다.
순번 | Tag | 태그 | 문제집 | 추천 문제 수 | 총 문제 수 |
---|---|---|---|---|---|
00 | Math | 수학 | 바로가기 | 18 | 29 |
01 | String | 문자열 | 바로가기 | 19 | 64 |
02 | Data Structure | 자료구조 | 바로가기 | 16 | 25 |
03 | Data Structure 2 | 자료구조 2 | 바로가기 | 11 | 21 |
04 | Brute Force | 완전탐색 | 바로가기 | 33 | 94 |
05 | Implementation | 구현 | 바로가기 | 30 | 51 |
06 | Simulation | 시뮬레이션 | 바로가기 | 30 | 48 |
07 | Tree | 트리 | 바로가기 | 15 | 44 |
08 | Greedy | 탐욕법 | 바로가기 | 27 | 62 |
09 | Dynamic Programming 1 | 동적계획법 1 | 바로가기 | 27 | 80 |
10 | Backtracking | 백트래킹 | 바로가기 | 28 | 75 |
11 | Graph Traversal | 그래프 탐색 | 바로가기 | 31 | 96 |
12 | Dynamic Programming 2 | 동적계획법 2 | 바로가기 | 28 | 81 |
13 | Binary Search | 이분탐색 | 바로가기 | 20 | 66 |
14 | Divide and conquer | 분할정복 | 바로가기 | 08 | 18 |
15 | Shortest Path | 최단거리 | 바로가기 | 18 | 53 |
16 | Two Pointer | 투 포인터 | 바로가기 | 13 | 36 |
17 | Prefix Sum | 누적 합 | 바로가기 | 11 | 32 |
18 | Topological Sorting | 위상정렬 | 바로가기 | 05 | 14 |
19 | Disjoint Set | 분리 집합 | 바로가기 | 06 | 20 |
20 | Minimum Spanning Tree(MST) | 최소 스패닝 트리 | 바로가기 | 08 | 24 |
21 | Trie | 트라이 | 바로가기 | 05 | 09 |
22 | Dynamic Programming On Trees | 트리디피 | 바로가기 | 04 | 08 |