Skip to content

Added Korean translation #209

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions ko/그리디 알고리즘/분할 가능한 배낭 문제.md
Original file line number Diff line number Diff line change
@@ -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)
27 changes: 27 additions & 0 deletions ko/자료구조/스택/스택.md
Original file line number Diff line number Diff line change
@@ -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)