├── .github ├── config.yml └── workflows │ └── cpp.yml ├── .gitignore ├── CONTRIBUTION.md ├── README.md ├── algorithms └── CPP │ ├── Graph │ └── dijkstra.cpp │ └── README.md └── docs ├── Graph └── dijkstra.md └── README.md /.github/config.yml: -------------------------------------------------------------------------------- 1 | # Comment to be posted to on first time issues 2 | newIssueWelcomeComment: > 3 | Thanks for opening your first issue here! Be sure to follow the issue template! 4 | 5 | newPRWelcomeComment: > 6 | Thanks for opening this pull request! Please check out our contributing guidelines. 7 | 8 | firstPRMergeComment: > 9 | Congrats on merging your first pull request! 10 | -------------------------------------------------------------------------------- /.github/workflows/cpp.yml: -------------------------------------------------------------------------------- 1 | # GitHub Action to run cpplint recursively on all pushes and pull requests 2 | # https://github.com/cpplint/GitHub-Action-for-cpplint 3 | 4 | name: C++ 5 | on: 6 | push: 7 | branches: [ main ] 8 | paths: '**/**.cpp' 9 | pull_request: 10 | branches: [ main ] 11 | paths: '**/**.cpp' 12 | 13 | jobs: 14 | cpplint: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v2 18 | - uses: actions/setup-python@v2 19 | - run: pip install cpplint 20 | - run: cpplint --counting=detailed --filter=-build/namespaces,-legal,-readability,-runtime,-whitespace --recursive . -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files 2 | .DS_Store 3 | .DS_Store? 4 | ._* 5 | .Spotlight-V100 6 | .Trashes 7 | ehthumbs.db 8 | Thumbs.db 9 | 10 | # binary files 11 | *.out 12 | *.class 13 | *.idea 14 | 15 | # vscode 16 | .vscode/ -------------------------------------------------------------------------------- /CONTRIBUTION.md: -------------------------------------------------------------------------------- 1 | # 기여하는 법 2 | 본 문서는 해당 레포지토리에 대해 초심자들이 첫 기여를 간단하게 할 수 있도록 가이드라인을 제시하고자 합니다. 3 | 4 | ## Fork 5 | 레포지토리 페이지 우측 상단에 **Fork** 버튼을 찾을 수 있습니다. 클릭하면, 본인의 계정에 이 레포지토리의 복사본을 생성하게 됩니다. 6 | 7 | ## Clone 8 | 새롭게 본인의 계정에 생성된 복사본 레포지토리를 이제 본인의 기기로 clone하면 됩니다. 본인의 계정 페이지로 가서, fork된 복사본 레포지토리를 열고, **Code**버튼을 누르면 clone을 위한 다양한 옵션들을 확인할 수 있습니다. 9 | Git이나 CLI가 익숙하지 않으신 분들은 **Github Desktop**을 설치하고, Code버튼을 누른 후 드롭다운에서 Open with GIthub Desktop 옵션을 선택하여 진행하면 됩니다. 10 | 11 | 다양한 방법이 있지만, HTTPS 링크를 활용한 방법을 소개하겠습니다. 12 | 레포지토리를 본인 기기에 설치하고 싶은 경로에서 터미널을 열고, 아래와 같은 형태의 git command를 입력하시면 됩니다. 13 | ```git 14 | git clone https://github.com/this-is-you/Algorithms.git 15 | ``` 16 | 여기서 `this-is-you`에 본인의 GitHub 이름을 입력하시면 됩니다. 이렇게 함으로써 fork해온 레포지토리의 내용물을 본인의 기기에 복사받을 수 있습니다. 17 | 18 | ## Branch 생성 19 | 이제 생성한 레포지토리 안쪽으로 진입합시다. 20 | ``` 21 | cd Algorithms 22 | ``` 23 | 이제 `git checkout` 커맨드를 사용해 새로운 Branch를 만들어 봅시다. 24 | ``` 25 | git checkout -b new-branch-name 26 | ``` 27 | 예를 들어: 28 | ``` 29 | git checkout -b add-work 30 | ``` 31 | (Branch의 이름은 본인 마음대로 작성하면 되지만, 해당 branch의 목적이 잘 드러나도록 이름을 짓는 것이 좋습니다.) 32 | 33 | ## 변경 후 Commit 34 | 이제 본인이 기여하고자 하는 바대로 알고리즘 소스 코드 파일을 추가하거나, 기존 파일의 문제점을 수정하거나, 새로운 Documentation을 추가하거나 등의 변경 작업을 수행하면 됩니다. (파일의 세부 양식은 해당 문서를 따로 참고해주시기 바랍니다.) **특히 변경된 directory의 README.md 파일이 업데이트가 필요한 경우 반드시 그에 따라 업데이트 해주시기 바랍니다.** 35 | 36 | 이제 해당 프로젝트 경로에서 `git status`커맨드를 실행하면, 어떤 변경사항들이 있었는지 알 수 있을 겁니다. 37 | 해당 변경사항들을 `git add`커맨드를 통해 아까 만들었던 branch에 추가해줍시다. 38 | ```git 39 | git add "추가하거나 변경한 파일 이름" 40 | ``` 41 | 이제 이 변경사항들을 `git commit`커맨드를 통해 commit해줍시다. 42 | ```git 43 | git commit -m "변경사항에 대한 commit 메세지" 44 | ``` 45 | 46 | ## Github에 변경사항 push하기 47 | `git commit`을 통해 본인의 로컬 기기에는 변경사항들이 저장되었지만, GitHub 원격 저장소에는 해당 변경사항들을 아직 업데이트해주지 못했습니다. 48 | 49 | `git push`커맨드를 통해 이러한 변경사항들을 원격 저장소로 push해줍시다. 50 | ```git 51 | git push origin 52 | ``` 53 | 여기서 `` 부분을 아까 지었던 branch의 이름으로 대체해주시면 됩니다. 54 | 55 | ## 변경사항 제출하고 review받기 56 | 이제 GitHub에서 fork해서 생성했던 본인의 레포지토리로 가보면, 새로운 `Compare & pull request` 버튼이 보일 겁니다. 말 그대로 원본 레포지토리와 변경사항들을 비교하고, 이러한 변경사항들을 원본 레포지토리로 보내고자 하는 pull request를 생성하는 버튼입니다. 클릭해 봅시다. 57 | 58 | 양식에 따라 pull request에 대한 내용들을 작성하고, `Create pull request`버튼을 통해 pull request를 생성하면 끝입니다. 이제 원본 레포지토리의 관리자들이 해당 pull request의 내용들을 review하고, 문제가 없다고 판단되면 원본 프로젝트의 master branch로 merge하게 됩니다. merge가 일어날때 해당 사항에 대한 알림 메일을 받을 수 있습니다. 59 | 60 | ## 축하합니다! 61 | 프로젝트 기여자로서 자주 경험하게 될 일반적인 *fork -> clone -> edit -> pull request* workflow를 방금 완료하셨습니다. 이를 숙지하고 익숙해진다면 이후 다양한 프로젝트에 더욱 손쉽게 기여할 수 있을 것입니다. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Algorithms 2 | 3 | 함께 만들어가는 알고리즘 라이브러리 4 | 5 | # Contribution Guidelines 6 | [처음 기여하는 사람들을 위한 문서](/CONTRIBUTION.md) 7 | ## 1. 기여 양식 8 | 9 | 기여의 단위는 하나의 **파일**(Eg. [`dijkstra.cpp`](./algorithms//CPP/Graph/dijkstra.cpp), `binary-search.java`)이나 **경로** (`longest-increasing-subsequence/`)여야 합니다. 편의상 이 단위를 `단위 파일`이라고 부르도록 하겠습니다. 10 | - 하나의 파일이 아닌 폴더(경로)를 기여하고자 할 경우에는, 해당 폴더 내에 그에 대한 설명 문서가 존재해야 합니다. (README.md) 11 | 12 | 본 레포지토리의 파일 경로는 `algorithms/{language}/{category}/{problem}`의 형태를 띄고 있는데, 13 | - `{language}`는 코드에 사용된 언어를 뜻하고(Eg. C++의 경우 `CPP`, Java의 경우 `Java`, 등등), 14 | - `{category}`는 기여할 단위 파일의 주제나 분류를 뜻하며(Eg. `Graph`, `Sorting` 등등), 15 | - `{problem}`은 `단위 파일`에 걸맞는 이름을 뜻합니다.(Eg. `binary-search.java`, `longest-increasing-subsequence`, `persistent-segment-tree.cpp`, 등등) 16 | 17 | 하나의 `단위 파일`은 아래와 같은 규칙들을 지켜야 합니다. 18 | - 모든 파일명/경로명은 **영어 소문자**로 작성되어야 합니다. 19 | - 띄어쓰기가 필요한 경우 **대시/하이픈 기호**를 사용해야 합니다(`-`). 20 | 21 | 아직 존재하지 않는 주제/분류에 대한 기여를 하거나, 이미 존재하는 주제/분류의 하위 주제로 볼 수 있는 항목에 대한 기여를 할 경우 그에 알맞게 새로운 경로를 생성해도 좋습니다. 22 | 23 | ## 2. 기여 규칙 24 | - 코드 내에 외부 라이브러리에 대한 참조는 허용하지 않습니다. 25 | - 각 언어별 표준 라이브러리의 사용은 허용됩니다. 26 | - 기여의 단위는 하나의 알고리즘이나 자료구조, 혹은 그를 응용한 하나의 문제 상황에 대해서만 이루어져야 합니다. 27 | - 해당 항목에 대한 코드를 `algorithms`경로에 기여하거나, 자세한 설명 문서를 `docs`경로에 기여하면 됩니다. 28 | - 주제/분류에 대한 설명일 경우 `docs`에, 코드 자체에 대한 설명일 경우 코드와 같은 경로에 별도의 문서(Eg. README.md)를 첨부하여 하나의 폴더로 기여하면 됩니다. 29 | - 기여한 내용에 대한 최소한의 설명은 주어져야 합니다. 30 | - 코드는 최대한 가독성 있게 작성합니다. 31 | - 필요한 경우, 적절한 주석을 첨부해 줍시다. 32 | - 코드와 설명 문서를 탑재할 경우, 코드의 시간/공간 복잡도와 간단한 테스트 케이스를 함께 제공해 줍시다. 33 | - 하나의 소스 코드 파일만을 기여할 경우엔, 해당 파일 내에 주석으로 위 사항들을 포함해 줍시다. 34 | - 가급적이면 각 언어별 Naming Convention을 따르도록 합시다. 35 | - 변수/함수명은 각 변수/함수의 목적이 뚜렷하게 드러나도록 합시다. -------------------------------------------------------------------------------- /algorithms/CPP/Graph/dijkstra.cpp: -------------------------------------------------------------------------------- 1 | //Dijkstra's algorithm 2 | //implemented in the context of a directed graph 3 | #include 4 | using namespace std; 5 | 6 | int dijkstra(vector>>& graph, int start, int end){ 7 | //return value(-1 if endpoint is unreachable) 8 | int ret=-1; 9 | 10 | //storing cost(distance) of each vertex, set initial value as -1 11 | vector dist(graph.size(),-1); 12 | 13 | //priority queue to store traversing vertices and cost values 14 | //data will be stored in the format of: {cost, current vertex} 15 | //entry with minimum cost will always be on top 16 | priority_queue,vector>,greater>> pq; 17 | pq.push({0,start}); 18 | 19 | while(!pq.empty()){ 20 | int cVertex, cCost; 21 | tie(cCost,cVertex) = pq.top(); 22 | pq.pop(); 23 | 24 | //vertex already visited with lower cost -> continue 25 | if(dist[cVertex]!=-1&&dist[cVertex]<=cCost)continue; 26 | //otherwise we update our current cost(distance) 27 | dist[cVertex]=cCost; 28 | 29 | if(cVertex==end){ 30 | ret=cCost; 31 | break; 32 | } 33 | 34 | for(pair nPair : graph[cVertex]){ 35 | int nVertex, nCost; 36 | tie(nVertex,nCost) = nPair; 37 | if(dist[nVertex]!=-1&&dist[nVertex]<=cCost+nCost){ 38 | //the next vertex has already been traversed with lower cost 39 | continue; 40 | } 41 | //otherwise we add a new entry to the priority queue 42 | pq.push({nCost+cCost,nVertex}); 43 | } 44 | } 45 | return ret; 46 | } 47 | 48 | int main(){ 49 | //number of vertices(V) and edges(E) 50 | int V, E; 51 | cout << "Enter the number of vertices: "; 52 | cin >> V; 53 | cout << "Enter the number of edges: "; 54 | cin >> E; 55 | cout << "Enter each edge information in the format of: \n"; 56 | cout << "(Source vertex number) (Destination vertex number) (cost)\n"; 57 | //Adjacency list 58 | //data will be stored in the format of: {destination,cost} 59 | //with the first index as the source 60 | vector>> graph(V+1,vector>()); 61 | while(E--){ 62 | int source, dest, cost; 63 | cin >> source >> dest >> cost; 64 | graph[source].push_back({dest,cost}); 65 | } 66 | //starting point(start), ending point(end) 67 | int start, end; 68 | cout << "Enter the starting point: "; 69 | cin >> start; 70 | cout << "Enter the ending point: "; 71 | cin >> end; 72 | int answer = dijkstra(graph,start,end); 73 | if(answer==-1){ 74 | cout << "Shortest path from " << start << " to " << end << " does not exist." << endl; 75 | } 76 | else 77 | cout << "The minimum cost for the shortest path is: " << answer << endl; 78 | } 79 | //Time complexity: O(ElogV) 80 | //Space complexity: O(V+E) 81 | 82 | /* 83 | Sample Input 84 | 5 85 | 8 86 | 1 2 2 87 | 1 3 3 88 | 1 4 1 89 | 1 5 10 90 | 2 4 2 91 | 3 4 1 92 | 3 5 1 93 | 4 5 3 94 | 1 95 | 5 96 | Output(minimum cost) 97 | 4 98 | */ -------------------------------------------------------------------------------- /algorithms/CPP/README.md: -------------------------------------------------------------------------------- 1 | # C++ 2 | 3 | ## 그래프 4 | - [다익스트라 알고리즘](Graph/dijkstra.cpp) -------------------------------------------------------------------------------- /docs/Graph/dijkstra.md: -------------------------------------------------------------------------------- 1 | # 다익스트라 알고리즘 2 | 다익스트라 알고리즘은 그래프 상에서 다이나믹 프로그래밍(DP)을 활용한 대표적인 **최단 경로 알고리즘**입니다. 3 | 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 알 수 있으며, 다만 이때 음의 가중치를 가진 간선이 그래프에 존재할 경우 사용할 수 없습니다. 4 | ## 작동 과정 5 | 1. 출발 정점 설정(방문) 6 | 2. 방문한 정점들과 인접한 방문하지 않은 정점 중 도달 비용이 가장 적은 정점 선택(방문) 7 | 3. 최소 비용 갱신 8 | 위와 같은 과정에서 2~3번을 더 이상 방문할 노드가 없을 때까지 반복합니다. 9 | 10 | 그래프 상의 모든 정점들의 개수를 **V**, 모든 간선들의 개수를 **E**라고 할때, 11 | ## 시간 복잡도 12 | - O(ElogV) 13 | - 인접 리스트와 Min Heap(Priority Queue)자료구조를 활용해야 합니다. 14 | ## 공간 복잡도 15 | - O(V+E) 16 | ## 소스 코드 17 | - [C++](../../algorithms/CPP/Graph/dijkstra.cpp) -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # 알고리즘 2 | 3 | ## 그래프 4 | - [다익스트라](Graph/dijkstra.md) 5 | 6 | # 자료 구조 7 | --------------------------------------------------------------------------------