Skip to content

Commit d11df72

Browse files
committed
docs: update study notes
1 parent 559dfcd commit d11df72

File tree

3 files changed

+365
-1
lines changed

3 files changed

+365
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
*/node_modules
2-
*/.parcel-cache
2+
*/.parcel-cache
3+
.DS_Store

algorithms/study-notes/1.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# 알고리즘 강의 정리노트
2+
3+
## 🔎 학습 계획
4+
5+
- 출처: 한국방송통신대 알고리즘 강의 정리노트입니다.
6+
- 목표: 알고리즘 기초 다지기
7+
- 일자: 2025-03-02
8+
9+
---
10+
11+
# 시작하며
12+
13+
## 💡 알고리즘 과학
14+
15+
데이터를 컴퓨터에 입력하고, 정보를 만드는 과정에서, 프로그램은 데이터를 처리해 결과를 만드는 도구다. 프로그램은 알고리즘을 기반으로 동작한다.
16+
17+
>
18+
컴퓨터과학은 컴퓨터 + 데이터 + 프로그램 + 알고리즘의 결합이다.
19+
20+
## 🎯 학습 목표
21+
- 컴퓨터를 이용해 문제 해결 방법에 대해 체계적으로 생각하는 훈련을 한다.
22+
- 문제 해결을 위한 **지적 추상화 능력****통찰력**을 향상시킨다.
23+
- 문제 풀이 절차와 방법을 통해 효율적인 알고리즘을 만든다.
24+
25+
---
26+
27+
# 알고리즘
28+
👉 주어진 문제를 해결하거나 함수를 계산하기 위해 따라야할 명령어를 단계적으로 나열한 것
29+
30+
- **입출력:** 0개 이상의 외부 입력과, 1개 이상의 출력 생성
31+
- **명확성:** 각 명령은 모호하지 않고 단순 명확해야 한다.
32+
- **유한성:** 한정된 수의 단계를 거친 후에 반드시 종료
33+
- **유효성:** 모든 명령은 컴퓨터에서 수행할 수 있어야 한다.
34+
35+
알고리즘이 존재하면 컴퓨터를 통해 해결할 수 있다.
36+
다만 실용적 관점에서, 알고리즘은 효율적이어야 한다.
37+
38+
## 📌 예시: 문제의 규칙 찾기
39+
40+
### 최소값 찾기
41+
1. 첫 번째 데이터를 최솟값으로 저장
42+
2. 다음 숫자를 읽고, 이것과 저장된 최솟값을 비교
43+
3. 비교 후 더 작은 숫자를 최솟값으로 다시 저장
44+
4. 다음에 처리할 데이터가 있으면 2로
45+
5. 저장된 최소값을 결과로 출력
46+
47+
48+
### 오일러 경로 문제: 퀘닉스 버그 다리
49+
- 그래프의 모든 간선을 단 1번만 지나가는 경로의 존재 여부
50+
- 각 정점의 차수가 홀수인 정점이 0개 혹은 2개
51+
- 홀수점이 2개인 경우, 홀수점에서 시작한다.
52+
53+
### 최단경로 찾기
54+
- 단일 출발점 최단 경로
55+
- 다익스트라 알고리즘
56+
57+
---
58+
59+
# 알고리즘 생성
60+
- 설계: 상향식, 하향식 설계
61+
- 표현: 일상 언어, 순서도 flow chart, 의사 코드, 프로그래밍 언어
62+
- 검증: 수학적 증명
63+
- 분석: 시간 복잡도, 공간 복잡도
64+
65+
---
66+
67+
# 알고리즘 설계
68+
69+
적용 가능한 풀이 방식 중 더 효율적인 방식을 찾는다.
70+
```
71+
효율성의 기준: 시간 복잡도/공간 복잡도
72+
```
73+
아래는 알고리즘 설계에 대한 예시이다.
74+
75+
## 📌 탐색 알고리즘
76+
정렬된 배열에서 이진 탐색 O(log n)은 순차 탐색 O(n) 보다 효율적이다.
77+
78+
하지만 정렬되지 않은 배열에서 이진 탐색은 사용할 수 없다.
79+
80+
👉 특정 알고리즘이 다른 알고리즘보다 무조건 좋지는 않다. 문제의 조건에 맞는 알고리즘을 사용한다.
81+
82+
## 📌 탐욕 알고리즘(greedy, 욕심쟁이)
83+
해를 구하는 일련의 선택 과정에서, 전후 단계의 선택과는 상관없이, 가장 최선이라고 여겨지는 국부적인 최적해를 선택해, 결과적으로 전체적인 최적해를 구할 수 있을 것이라는 **희망적**인 전략이다.
84+
```
85+
단점: 국부적인 최적해들이 전체 최적해를 보장하지 않을 수 있다.
86+
```
87+
88+
- 거스름돈, 베낭
89+
- 최소 신장 트리: 크루스칼, 프림 알고리즘
90+
- 단일 출발점 최단 경로: 다익스트라 알고리즘
91+
92+
### 📝 거스름돈 문제
93+
> 돌려줄 거스름돈 T가 있을 때, 고객이 받을 동전의 개수를 최소로 하기
94+
95+
- 액면가가 큰 순부터 가장 최선의 해를 구함
96+
- 가장 큰 동전부터 선택하면 동전 개수가 최소가 될 것을 가정한 풀이법
97+
98+
탐욕 알고리즘을 사용했을 때, 만약 동전의 종류가 [500, 120, 100, 50, 10]이라면 650원의 값을 구하기 위해 실제 최적해 3개가 아닌, 5개의 결과를 도출하게 된다.
99+
100+
👉 동전의 단위가 서로 배수 관계일 때, 탐욕 알고리즘이 잘 동작한다.
101+
👉 탐욕적 선택이 최적해를 보장하지 못하는 경우, DP와 같은 다른 방식을 사용한다.
102+
103+
### 📝 베낭 문제
104+
105+
> - 최대 용량 M인 1개의 베날과, n개의 물체가 있다고 가정
106+
> - 각 물체 i는 무게 (w_i), 이익 (p_i)를 가짐
107+
108+
#### A. 물체를 쪼개서 넣을 수 있는 경우
109+
110+
베낭의 용량을 초과하지 않는 범위에서, 베낭의 물체 이익의 합이 최대가 되도록 물체를 넣는 방법
111+
112+
테스트 케이스에서 베낭 용량이 10이고, 물체가 4개, w=[3, 5, 3, 4], p=[15, 20, 9, 4]인 경우, 단위 무게(w) 당 이익은 [5, 4, 3, 3.5]으로, 물체는 0, 1, 3, 2 순으로 이득이다.
113+
114+
물체를 단위 무게 당 이익이 높은 순부터 순차적으로 베낭에 넣는다면
115+
116+
첫 번째 물체 0(w=3)을 넣으면 베낭의 남은 용량은 7이 된다.
117+
두 번째 물체 1(w=5)를 넣으면 베낭의 남은 용량은 2가 된다.
118+
세 번째 물체 3(w=4)를 남은 용량(2)만큼 넣으면 베낭의 남은 용량은 0이 된다.
119+
최대 이익은 15 + 20 + 14/2 = 42가 된다.
120+
121+
#### B. 물체를 쪼갤 수 없는 경우: 0/1 베낭 문제
122+
123+
0/1 베낭 문제의 가정은 물체를 부분적으로 넣을 수 없는 경우이다. (물체의 삽입은 false/true)
124+
125+
만약 탐욕 알고리즘을 사용하여 문제를 풀이할 경우, 세 번째 물체를 넣을 수 없으므로 4의 용량이 남게 되어, 최대 이익은 35가 된다.
126+
127+
하지만 실제 최대 이익은 베낭에 10의 용량만큼 0, 2, 3번째 물건을 넣어서 나오는 38이다.
128+
129+
👉 따라서 0/1 베낭 문제는 탐욕 알고리즘으로 해결할 수 없다. (MP 완전, 근사 알고리즘)
130+
131+
## 📌 분할정복
132+
133+
### 하향식 접근 top-down
134+
135+
> 퀵 정렬, 합병 정렬, 이진 탐색
136+
137+
주어진 문제의 입력을 더 이상 나눌 수 없을 때까지 2개 이상의 작은 문제들로 순환적으로 분할하고, 분할한 작은 문제들을 각각 해결한 뒤, 해를 결합하여 원래 문제의 해를 구하는 방식
138+
139+
#### 특징
140+
- **분할된 작은 문제는 원래의 문제와 동일하다:** 입력의 크기만 작아짐
141+
- **분할된 문제는 서로 독립적이다:** 순환적인 분할 및 결과의 결합
142+
143+
#### 순환 호출 시, 작업 수행
144+
- **분할:** 주어진 문제의 입력을 여러 작은 문제로 분할한다.
145+
- **정복:** 작은 문제들을 순환적으로 분할한다. 만약 작은 문제가 더 분할되지 않을 정도로 크기가 작다면, 순환 호출 없이 작은 문제에 대한 해를 구한다.
146+
- **결합:** 작은 문제에 대해 정복된 해를 결합하여 원래 문제의 해를 구한다.
147+
148+
### 📝 이진 탐색
149+
150+
정렬된 데이터에서 목표값을 찾기 위해서 이진 탐색을 실행한다.
151+
152+
[10, 15, 20, 25, 30, 35, 40, 45, 50]에서 목표값 20을 찾기 위해서 이진 탐색을 실행하면 Mid를 4, 1, 2로 이동하여 3번 탐색만에 20의 위치인 인덱스 2를 반환할 수 있다.
153+
154+
- 분할: 배열의 가운데 원소를 기준으로 왼쪽 배열과 오른쪽 배열으로 분할한다. 탐색 키(목표값) Mid가 같다면 인덱스를 반환하고 종료한다.
155+
- 정복: 탐색 키가 가운데 원소보다 작으면 왼쪽 배열을 대상으로 이진 탐색을 순환 호출하고, 아니라면 오른쪽 배열을 대상으로 이진 탐색을 순환 호출한다.
156+
- 결합: x, 부분 배열에 대한 탐색 결과가 직접 반환되므로 결합이 불필요
157+
158+
### 동적 프로그래밍 Dynamic Programming: 상향식 접근 bottom-up
159+
160+
> 플로이드 알고리즘(모든 정점 쌍 간 최단 경로), 행렬의 연쇄적 곱셈, 최장 공통 부분 수열
161+
162+
입력의 크기가 가장 작은 부분문제부터 해를 구하여 테이블에 저장해놓고, 이를 이용하여 입력 크기가 보다 큰 문제의 해를 점진적으로 만들어가는 방식
163+
164+
#### 특징
165+
- **각각의 작은 문제는 원래의 문제와 동일하다:** 입력의 크기만 작아짐
166+
- **작은 문제는 서로 독립적일 필요가 없다:** 문제가 겹쳐질 수 있음, 중복 계산을 막기 위해 테이블에 메모이제이션 한다.
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# 운영체제
2+
3+
## 🔎 학습 계획
4+
5+
- 출처: 한국방송통신대 운영체제 강의 정리노트입니다.
6+
- 목표: 운영체제 관련 학습
7+
- 일자: 2025-03-02
8+
9+
---
10+
11+
# 💡 운영체제
12+
13+
컴퓨터 시스템은 기계장치 하드웨어와, 프로그램 소프트웨어로 구성된다.
14+
15+
- 사용자 - 응용 소프트웨어 - 시스템 소프트웨어 - 하드웨어
16+
17+
운영체제는 대표적인 시스템 소프트웨어다.
18+
컴퓨터 시스템의 자원을 관리하고, 컴퓨터 프로그램이 동작하기 위한 서비스를 제공하는 프로그램의 모음이다.
19+
20+
# 👓 운영체제의 역할
21+
22+
## 컴퓨터 시스템의 자원 관리
23+
24+
- 목적: 컴퓨터 시스템을 효율적으로 운영
25+
- 자원: 하드웨어 자원, 소프트웨어 자원, 데이터
26+
- 저장장치에서 데이터 읽기
27+
- 키보드, 마우스 제어
28+
- 프로그램 동시 실행 시, CPU와 메모리를 효율적으로 관리
29+
30+
## 사용자 지원
31+
32+
- 사용자가 내린 명령을 해석/실행
33+
- 사용자와 하드웨어 사이의 매개체
34+
- 사용자에게 편의성을 제공
35+
36+
# 📌 컴퓨터 시스템과 운영체제
37+
38+
## 운영체제가 없던 초기의 컴퓨터 시스템
39+
40+
```
41+
사용자 - 응용 프로그램 - 하드웨어
42+
```
43+
44+
응용 프로그램이 직접 컴퓨터 시스템의 자원을 제어해야 했으므로, 응용 프로그램 개발자는 **로우레벨의 하드웨어 제어** 방법을 알아야 했다.
45+
46+
또한 여러 사용자가 하드웨어를 공유하는 경우, **사용자간 자원 분할**이 어려웠다.
47+
48+
## 운영체제가 있는 컴퓨터 시스템
49+
50+
```
51+
사용자 - 응용 프로그램 - 운영체제 - 하드웨어
52+
```
53+
54+
하드웨어와 응용 프로그램 사이에 운영체제가 위치한다. 사용자와 하드웨어 사이의 중간 매개체 역할을 하기 때문에 로우레벨의 하드웨어 제어를 하지 않는다.
55+
56+
운영체제가 컴퓨터 시스템의 자원을 제어한다. 응용프로그램과 하드웨어 중간자 역할을 한다.
57+
58+
👉 운영체제를 통해 안정적이고 효율적으로 동작한다.
59+
60+
---
61+
62+
# 📌 커널 Kernel
63+
64+
커널 모드에서 동작하는 운영체제의 핵심 요소이다.
65+
응용 프로그램과 하드웨어 수준의 처리 사이의 가교 역할
66+
67+
68+
## 일체형 커널 monolithis kernel
69+
70+
- **커널 == OS:** 운영체제의 모든 서비스가 커널 내에 포함된다.
71+
- ex) UNIX, Linux
72+
- **장점:** 커널 내부 요소들이 서로 효율적으로 상호작용할 수 있다.
73+
- **단점:** 한 요소라도 오류가 발생하면, 시스템 전체 장애 발생 가능
74+
75+
76+
## 마이크로커널 microkernel
77+
78+
- 커널을 최소화하고, 운영체제 요소의 대부분을 커널 외부로 분리한다.
79+
- 메모리 관리, 멀티태스킹, 프로세스 간 통신 IPC와 같은 최소한의 요소를 커널 내부에 둔다.
80+
- **장점: **새로운 서비스를 추가하여 확장하기 쉽고, 유지보수가 용이하며 안정성이 우수하다.
81+
- **단점:** 커널 외부 요소들 사이에 IPC가 필요하여 성능 저하가 발생한다.
82+
83+
---
84+
85+
# 📌 커널 모드와 사용자 모드
86+
87+
## 커널 모드(슈퍼바이저 모드)
88+
- 하드웨어를 직접 제어할 수 있는 CPU 명령어를 사용할 수 있는 모드
89+
- 운영체제의 커널이 동작한다.
90+
91+
## 사용자 모드(보호 모드)
92+
- CPU 명령어를 사용할 수 없는 모드 (하드웨어를 컨트롤할 수 없는 모드)
93+
- 응용 프로그램이 동작한다.
94+
95+
## 시스템 호출 System Call
96+
- 응용 프로그램이 하드웨어에 대한 제어가 필요한 경우, 운영체제에 서비스를 요청한다.
97+
![](https://velog.velcdn.com/images/dusunax/post/aae746dc-e001-461c-a64e-28d9cad6fab0/image.png)
98+
99+
---
100+
101+
# 📌 운영체제 주요 관리 기능
102+
103+
컴퓨터 시스템의 자원의 성격에 따라 프로세스 관리자, 메모리 관리자, 파일 관리자, 장치 관리자로 구분된다.
104+
105+
| 구분 | 역할 및 기능 |
106+
|---|---|
107+
| **프로세스 관리자** | 실행 중인 프로그램(프로세스) 관리, CPU 스케줄링, 프로세스 생성/종료/상태관리 |
108+
| **메모리 관리자** | 주기억장치(RAM) 관리, 프로세스 메모리 할당 및 회수, 가상 메모리 관리 |
109+
| **장치 관리자** | 각종 하드웨어 장치 드라이버 관리, 장치와 데이터 송수신 관리 |
110+
| **파일 관리자** | 파일 생성, 삭제, 읽기, 쓰기, 접근 권한 관리 |
111+
112+
113+
## 프로세스 관리자 Process Manager
114+
115+
```
116+
저장장치(프로그램 파일) - 메모리(프로세스) -(스케줄링)- CPU
117+
```
118+
119+
- 프로세스(실행 중인 프로그램)의 생성 및 삭제
120+
- CPU 할당을 위한 스케줄링
121+
- 프로세스 상태를 관리하며 상태 전이 처리
122+
123+
## 메모리 관리자 Memory Manager
124+
- 메모리(주기억장치) 공간에 대한 요구 유효성 확인
125+
- 메모리 할당 및 회수
126+
- 메모리 공간 보호
127+
128+
## 장치 관리자 Device Manager
129+
- 컴퓨터 시스템의 모든 장치 관리
130+
- 시스템 장치의 할당, 작동, 반환
131+
132+
## 파일 관리자 File Manager
133+
- 컴퓨터 시스템의 모든 파일 관리
134+
- 저장 장치의 공간 관리
135+
- 파일의 접근 제한 관리
136+
137+
---
138+
139+
# 📌 운영체제의 유형
140+
141+
| 운영체제 유형 | 설명 | 예시 |
142+
|---------------|------|---|
143+
| **일괄처리 운영체제** | 사용자가 작업을 일괄적으로 모아서 처리하는 방식 | 대규모 데이터 처리 |
144+
| **실시간 운영체제** | 즉시 반응이 필요한 작업을 처리하는 운영체제 | 제어 시스템, 항공기, 의료기기|
145+
| **분산 운영체제** | 여러 대의 컴퓨터가 네트워크를 통해 하나의 시스템처럼 동작. 자원 공유 및 부하 분산 | Hadoop, Azure |
146+
| **임베디드 운영체제** | 특정 기기나 제품에 내장되어 동작하는 운영체제 | 스마트폰, 자동차, 가전제품 IoT |
147+
| **하이브리드 운영체제** | 여러 운영체제의 특징을 결합한 형태 | 임베디드 + 실시간 운영체제 등 |
148+
149+
150+
## 일괄처리 운영체제 Batch processing OS
151+
152+
작업을 모아서 순서대로 처리한다.
153+
154+
일괄처리 운영체제를 통해, 과거 오퍼레이터가 하던 일을 프로그램이 빠르게 처리하게 되면서 전체적인 작업 처리 속도가 향상되었다. 나중에 들어온 작업들은 앞선 작업이 모두 끝날 때까지 대기한다.
155+
156+
> 💡 **배치 프로세싱**은 사용자와 상호작용 없이 한 번에 한 작업을 모아서 순서대로 처리하는 방식이다. 유휴 시간이 감소하고, 대량 작업 처리, 작업 스케줄링이 용이하다. 오류 발생 시 전체 프로세스가 중단 될 수 있고, 작업 순서 변경이 어렵다.
157+
>
158+
대형 서버, 데이터 분석, 대량 데이터 처리에서 여전히 사용되지만 비중이 줄어들었다.
159+
- ex) 대규모 데이터 정산, 야간 배치 프로그램, 로그 분석
160+
161+
162+
## 시분할 운영체제 Time-sharing OS
163+
164+
시간을 쪼개서 각 사용자의 프로그램을 한 번에 조금씩 수행한다.
165+
166+
대화형 Interactive 운영체제라고도 한다. 응답 시간(요청 시간부터 반응이 시작되는 시점)이 일괄처리 운영체제보다 크게 단축되었다.
167+
168+
> 여러 사용자가 동시에 사용하는 환경에서 CPU 시간을 작은 단위(time slice)로 나누어 각 사용자에게 번갈아가며 할당한다. 다중 사용자를 지원하고 응답이 빠르다.
169+
>
170+
> 시분할은 현대 운영체제의 기본 개념이며, 현재는 시분할 + 다중 프로그래밍 + 실시간 기능을 갖춘 하이브리드 운영체제를 사용된다.
171+
> - ex) 유닉스, 터미널 접속 환경
172+
173+
## 실시간 운영체제 Real-time OS, RTOS
174+
175+
원하는 시간 내에 프로그램의 결과를 얻을 수 있는 방식이다.
176+
177+
처리 결과가 현재의 결정에 큰 영향을 주는 환경에서 사용한다. 예를 들어 항공기, 미사일 제어 시스템, 증권거래 관리 시스템이 있다.
178+
179+
## 분산 운영체제 Distributed OS
180+
181+
분산 시스템(2개 이상의 컴퓨터 시스템이 네트워크로 연결되어 서로의 자원을 이용하는 시스템)을 관리한다.
182+
183+
다른 컴퓨터 시스템의 자원을 이용하는 것이, 자신의 컴퓨터 시스템의 자원을 이용하는 것처럼 가능해야 한다.
184+
185+
## 임베디드 운영체제 Embedded OS
186+
187+
특정 목적의 장치나 하드웨어에 내장되어 동작하는 운영체제이다.
188+
189+
범용형 기기가 아닌 제약된 자원에서 동작한다. 크기가 작고 가벼우며, 장치 맞춤형이라 성능 최적화가 쉽다. 업데이트 및 유지보수의 난이도가 높다. 예를 들어 스마트폰, 자동차, 가전제품, IoT에 사용된다.
190+
191+
192+
## 하이브리드 운영체제 Hybrid OS
193+
194+
여러 운영체제 기법을 혼합해서 만든 운영체제이다.
195+
196+
현대 시스템은 일괄처리, 시분할, 실시간, 임베디드과 같은 다양한 요구사항을 충족해야 한다. 하이브리드 운영체제는 과거 운영체제의 장점들을 모아 최신 하드웨어와 다양한 환경에 맞춘 현대 운영체제의 대표적인 형태이다.
197+

0 commit comments

Comments
 (0)