diff --git "a/ko/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/\353\266\204\355\225\240 \352\260\200\353\212\245\355\225\234 \353\260\260\353\202\255 \353\254\270\354\240\234.md" "b/ko/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/\353\266\204\355\225\240 \352\260\200\353\212\245\355\225\234 \353\260\260\353\202\255 \353\254\270\354\240\234.md" new file mode 100644 index 00000000..bbf4b9c6 --- /dev/null +++ "b/ko/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/\353\266\204\355\225\240 \352\260\200\353\212\245\355\225\234 \353\260\260\353\202\255 \353\254\270\354\240\234.md" @@ -0,0 +1,44 @@ +# 배낭 문제 (그리디 알고리즘) + +#### 문제 + +무게와 가치가 정해진 항목들의 집합이 주어졌을 때, 주어진 최대 무게 내에서 가치가 최대가 되도록 하는 항목의 수를 찾아라. + +##### 그리디 알고리즘은 분할 가능한 배낭 문제에서 항상 최적해를 제공한다. + +#### 시간 복잡도 + +최악: $O(nlog n)$ + +#### 예시 + +``` +배낭의 최대 무게 W = 60 +value = [280, 100, 120, 120] +weight = [40, 10, 20, 24] + +Ratio(V/W) = 7,10,6,5 +각 항목을 A,B,C,D라 하자. + +먼저 항목들을 가치와 무게의 비율을 기준으로 내림차순으로 정렬한다. +B는 배낭의 용량보다 작기 때문에 첫 번째로 선택된다. 다음으로, 남은 용량이 A의 무게보다 크기 때문에 A가 선택된다. +배낭의 남은 용량이 C의 무게보다 작기 때문에 C는 전체 항목을 선택할 수 없다. +따라서 C는 (60-50)/20의 비율만큼 일부만 선택된다. +이제 배낭의 용량은 지정된 항목들의 무게와 동일해서 더 이상 항목을 선택할 수 없다. + +선택된 물건들의 총 무게는 10+40+20*(10/20) = 60이다. + +총 이익은 100+280+120*(10/20) = 380+60 = 440이다. + +이것이 가장 적합한 선택이다. 다른 항목을 조합하여 더 많은 돈을 버는 것은 불가능하다. +``` + +#### 구현 + +- [C++](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/greedy_algorithms/knapsack.cpp) +- [Python](https://github.com/TheAlgorithms/Python/tree/master/knapsack) +- [C-Sharp](https://github.com/TheAlgorithms/C-Sharp/tree/master/Algorithms/Knapsack) + +#### 영상 URL + +[A CS50 video explaining the Greedy Algorithm](https://www.youtube.com/watch?v=Ou9OA0yQCYA) diff --git "a/ko/\354\236\220\353\243\214\352\265\254\354\241\260/\354\212\244\355\203\235/\354\212\244\355\203\235.md" "b/ko/\354\236\220\353\243\214\352\265\254\354\241\260/\354\212\244\355\203\235/\354\212\244\355\203\235.md" new file mode 100644 index 00000000..50106851 --- /dev/null +++ "b/ko/\354\236\220\353\243\214\352\265\254\354\241\260/\354\212\244\355\203\235/\354\212\244\355\203\235.md" @@ -0,0 +1,27 @@ +# 스택 + +스택은 객체에 접근하는 순서가 정해진 기본적인 선형 데이터 구조이다. 이 순서는 LIFO (Last In First Out) 또는 FILO (First in Last Out)라고 불린다. 대표적인 스택 예시로는 식당의 접시, 쌓인 책 더미, 프링글스 상자 등이 있다. +스택은 파서 및 식 평가, 백트래킹 알고리즘 등을 구현하는 데 사용된다. 기본 작업은 스택에 요소를 넣는 것(push)과 스택에서 요소를 빼는 것(pop)이다. +연결 리스트 또는 리스트 배열을 사용하여 구현할 수 있다. 스택은 가장 위에 있는 요소를 가리키는 "top 포인터" 하나만 가진다. 삽입과 삭제는 스택의 한쪽 끝에서만 발생한다. + +# 표준 스택 연산자 + +1) push(): 스택의 맨 위에 요소 삽입 +2) pop(): 스택의 맨 위에 있는 요소 삭제 +3) isEmpty(): 스택이 비어 있는지 여부 확인 +4) isFull(): 스택이 가득 찼는지 여부 확인 +5) peek(): 맨 위에 있는 요소의 값을 가져옴(제거X) + +# 스택으로 작업하기 + +스택에서는 TOP이라는 포인터를 사용하여 스택의 맨 위에 있는 요소를 추적한다. 스택을 초기화할 때, TOP의 값을 -1로 설정하여 TOP == -1인 경우 스택이 비어 있는지 확인할 수 있다. 요소를 push할 때마다, TOP의 값을 증가시키고, TOP이 가리키는 위치에 새로운 요소를 넣는다. 요소를 pop할 때, TOP이 가리키는 값을 반환하고, TOP의 값을 감소시킨다. push하기 전에 스택이 가득 차 있는지 확인하고, pop하기 전에 스택이 이미 비어 있는지 확인한다. + +# 소스 + +1) [Stack Data Structure - GeeksForGeeks](https://www.geeksforgeeks.org/stack-data-structure/) +2) [DS-Stack JavaPoint](https://www.javatpoint.com/data-structure-stack) +3) [Stack Data Structure](https://www.programiz.com/dsa/stack) + +# 영상 URL + +- [Stack Data Structure](https://youtu.be/F1F2imiOJfk)