Skip to content

Commit eba4aa8

Browse files
authored
Korean translation of search algorithms (#141)
* add Korean translation for binary search. * add Korean translation for exponential search. * add Korean translation for linear search. * modify translation translate url names and language names to Korean. * fix directory structure ko/data_structure/search to ko/search
1 parent 9e8927e commit eba4aa8

File tree

3 files changed

+166
-0
lines changed

3 files changed

+166
-0
lines changed

ko/탐색/선형탐색.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 선형 탐색
2+
3+
#### 문제
4+
5+
원소 n개로 이루어진 배열이 주어졌을 때, 입력받은 원소의 인덱스를 반환하는 함수를 작성하라.
6+
7+
#### 접근 방식
8+
9+
- 배열의 첫번째 원소부터 시작하여 반복한다.
10+
- 찾는 원소와 같은지 비교한다.
11+
- 같다면, 인덱스를 반환한다.
12+
- 아니면 다음 인덱스로 넘어가 반복한다.
13+
- 찾는 원소가 배열에 없다면, -1을 반환한다.
14+
15+
#### 시간 복잡도
16+
17+
최악의 경우: O(n)
18+
최선의 경우: O(1) (배열의 첫번째 원소가 찾는 원소인 경우)
19+
20+
#### 공간 복잡도
21+
22+
O(1)
23+
24+
#### 예시
25+
26+
```
27+
배열 = [1, 3, 9, 5, 0, 2]
28+
29+
찾는 원소 = 5
30+
5는 배열의 세번째 원소이므로, 선형 탐색은 3을 반환한다.
31+
32+
찾는 원소 = 6
33+
6은 배열에 존재하지 않으므로, 선형 탐색은 -1을 반환한다.
34+
```
35+
36+
#### 구현
37+
38+
- [자바](https://github.com/TheAlgorithms/Java/blob/master/Searches/LinearSearch.java)
39+
- [C++](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/Search/Linear%20Search.cpp)
40+
- [파이썬](https://github.com/TheAlgorithms/Python/blob/master/searches/linear_search.py)
41+
42+
#### 영상 URL
43+
44+
[선형 검색: CS50](https://www.youtube.com/watch?v=CX2CYIJLwfg)
45+
46+
#### 시각화된 설명
47+
48+
- [Tute 보드](https://boardhub.github.io/tute/?wd=linearSearchAlgo)

ko/탐색/이분탐색.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 이분 탐색 (분할 정복 알고리즘)
2+
3+
#### 문제
4+
5+
원소 n개로 이루어진 정렬된 배열이 주어졌을 때, 입력받은 원소의 인덱스를 반환하는 함수를 작성하라.
6+
7+
#### 접근 방식
8+
9+
- 배열을 반으로 계속 나누어 가며 탐색할 것이다(분할 정복).
10+
- 먼저, 주어진 배열에서 가운데에 있는 원소를 선택한다.
11+
- 만약 선택한 원소와 찾는 원소가 같다면, 그 인덱스를 반환하고 종료한다.
12+
- 만약 선택한 원소가 찾는 원소보다 작다면, 배열의 오른쪽 절반만 고려하면 된다. 오른쪽 절반 배열에 대해 처음부터 반복한다.
13+
- 만약 선택한 원소가 찾는 원소보다 크다면, 배열의 왼쪽 절반만 고려하면 된다. 왼쪽 절반 배열에 대해 처음부터 반복한다.
14+
- 만약 찾는 원소가 초기 배열에 없다면, -1을 반환하면 된다.(분할 정복을 반복하다 보면 배열의 크기가 1이하가 되고, 이때 찾는 원소가 없다면 없는 것이다.)
15+
16+
#### 시간 복잡도
17+
18+
최악의 경우: O(log n)
19+
최선의 경우: O(1)
20+
(찾는 원소가 초기 배열의 가운데에 있는 경우)
21+
22+
#### 공간 복잡도
23+
24+
단순 반복으로 구현한 경우, O(1)
25+
재귀를 사용하는 경우, O(log n)
26+
(재귀함수를 부를 때마다 스택에 쌓이므로)
27+
28+
#### 예시
29+
30+
```
31+
배열 = [1,2,3,4,5,6,7]
32+
33+
찾는 원소 = 2 인 경우
34+
찾는 원소(2)가 가운데에 있는 원소(4)보다 작다. 따라서 배열의 왼쪽 절반만 고려하면 된다.
35+
왼쪽 절반인 [1,2,3]에서, 가운데 원소는 2이므로 찾았다. 이 원소의 인덱스(1) 을 반환한다.
36+
37+
찾는 원소 = 9 인 경우
38+
배열을 절반으로 나누어 가며 찾다보면, 배열에 9가 없음을 알 수 있다. -1을 반환한다.
39+
```
40+
41+
#### 구현
42+
43+
- [자바](https://github.com/TheAlgorithms/Java/blob/master/Searches/BinarySearch.java)
44+
- [C++](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/Search/Binary%20Search.cpp)
45+
- [파이썬](https://github.com/TheAlgorithms/Python/blob/master/searches/binary_search.py)
46+
- [C#](https://github.com/TheAlgorithms/C-Sharp/blob/master/searches/binary_search.cs)
47+
- [C](https://github.com/TheAlgorithms/C/blob/master/searching/Binary_Search.c)
48+
49+
#### 영상 URL
50+
51+
[CS50: 이분 탐색](https://www.youtube.com/watch?v=5xlIPT1FRcA)
52+
53+
#### 시각화된 설명
54+
55+
- [Tute 보드](https://boardhub.github.io/tute/?wd=binarySearchAlgo2)

ko/탐색/지수적탐색.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# 지수적 탐색
2+
3+
#### 먼저 알아야 할 내용
4+
5+
- 이분 탐색
6+
7+
#### 문제
8+
9+
원소 n개로 이루어진 정렬된 배열이 주어졌을 때, 입력받은 원소의 인덱스를 반환하는 함수를 작성하라.
10+
11+
#### 접근 방식
12+
13+
- 먼저, 찾는 원소가 존재하는 **범위**를 구한다. 이때, 범위는 *인덱스*를 2씩 계속 곱한 것을 사용한다.
14+
- 만약 그 범위가 유효하면(주어진 배열 안이라면) 그 범위에서 이분 탐색을 수행하여 결과를 반환한다.
15+
- 아니라면, -1을 반환한다.
16+
17+
#### 예시
18+
19+
```markdown
20+
배열 = [1, 2, 3, 4, 5, 6, 7, ... 998, 999, 1_000]
21+
22+
찾는 원소 = 998
23+
인덱스 = 0
24+
1. 범위 구하기
25+
인덱스 = 1, 2, 4, 8, 16, 32, 64, ..., 512, ..., 1_024
26+
인덱스 = 1일때 배열의 1번째 원소(1)가 찾는 원소(998)보다 작으므로 인덱스에 2를 곱한다.
27+
인덱스 = 2일때 배열의 2번째 원소(2)가 찾는 원소(998)보다 작으므로 인덱스에 2를 곱한다.
28+
...
29+
10번째 반복 이후 인덱스는 1_024가 되고, 이는 배열 밖에 있으므로 멈춘다.
30+
2. 이분 탐색
31+
찾는 원소는 512번째와 1000번째 사이에 있으므로, 이 구간에서 이분 탐색을 이용한다.
32+
```
33+
34+
***참고***: 이분 탐색의 구간이 512에서 1_000인 것은 1.에서 얻은 인덱스 1_024가 배열의 마지막 인덱스 1_000보다 컸기 때문이다.
35+
36+
#### 시간 복잡도
37+
38+
**최악의 경우:** `O(log *i*)` (여기서 `*i*`는 찾는 원소의 인덱스이다.)
39+
40+
**최선의 경우:** `O(*1*)`
41+
42+
#### 시간 복잡도에 대한 설명
43+
44+
- 알고리즘의 첫번째 부분을 수행하는 데에 필요한 시간 복잡도는 **O( log *i* )**이다. 이는 인덱스에 2를 `⌈log(i)⌉`번 곱하고 나면 찾는 원소의 인덱스보다 크거나 같기 때문이다. 식으로는 `2^⌈log(i)⌉ >= i`와 같이 나타낼 수 있다.
45+
- 알고리즘의 두번째 부분을 수행하는 데에 필요한 시간 복잡도 역시 **O( log *i* )**이다. 단순 이분 탐색의 시간 복잡도는 구간의 크기 *k*일때 O(log *k*)이다. 여기서 이분 탐색을 수행하는 구간은 `2^(i-1)`부터 `2^i`까지 이므로, 구간의 크기는 `2^i - 2^(i-1) = 2^(i-1`이다.
46+
47+
따라서, 전체 알고리즘의 시간 복잡도는 다음과 같다.
48+
49+
```mathematica
50+
O(log i) + O(log i) = 2*O(log i) = O(log i)
51+
```
52+
53+
#### 이분 탐색 vs 지수적 탐색
54+
55+
이분 탐색과 지수적 탐색을 실제 상황에서 비교해보자. 크기 `1_000_000`인 배열이 있고, 우리가 찾는 원소는 그 배열의 4번째에 있다고 하자. 이떄,
56+
57+
- 이분 탐색을 이용하면 배열의 가운데에서 시작하여, 여러 번의 반복 이후에야 4번째 원소임을 찾을 수 있다.
58+
- 지수적 탐색은 단 2번의 반복만에 4번째 원소를 찾을 수 있다.
59+
60+
#### 구현
61+
62+
- [C++](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/search/exponential_search.cpp)
63+
- [자바스크립트](https://github.com/TheAlgorithms/Javascript/blob/master/Search/ExponentialSearch.js)

0 commit comments

Comments
 (0)