일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 분할정복
- 완전탐색
- stack
- 백트래킹
- 그리디
- 백준
- union-find
- 알고리즘문제해결전략
- DFS
- backtracking
- 종만북
- 분리집합
- 누적합
- 알고스팟
- 스택
- 유니온파인드
- DP
- 재귀
- 다이나믹프로그래밍
- BOJ
- 세그먼트트리
- 이분탐색
- 문자열
- Greedy
- 너비우선탐색
- 동적계획법
- acm
- BFS
- Algospot
- priority_queue
- Today
- Total
DAMPER's blog
0. Intro 본문
전북대학교 알고리즘 동아리 'COALA'에서 진행하는 기초 알고리즘 튜터링 내용을 기록합니다.
이 튜터링을 진행하기에 앞서 필요한 지식은 다음과 같습니다.
1. C/C++ 기본 문법에 대해 알고 있어야합니다.
2. 함수 사용 및 재귀함수가 무엇인지 알고 있어야 합니다.
알고리즘 문제를 잘 해결하기 위해서는 3가지가 필요합니다.
1. 여러 알고리즘, 자료구조 등 배경지식이 필요합니다.
2. 배경지식을 현재 문제 상황에 맞게 잘 선택, 변형할 줄 아는 능력(문제해결능력)이 필요합니다.
3. 생각한 풀이를 코드로 나타낼 수 있는 능력(구현력)이 필요합니다.
우리는 이 세가지 능력을 기르는 연습을 해야합니다.
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
알고리즘 문제 채점 사이트인 백준 온라인 저지입니다.
우리는 이 사이트에서 같이 문제를 해결하며 성장해나가면 됩니다.
알고리즘에 대해 알기 전에 시간복잡도, 공간복잡도에 대한 이해가 필요합니다.
시간복잡도는 해당 코드가 "몇번 정도 연산을 하는가?" 에 대한 내용이고,
공간복잡도는 해당 코드가 "어느 정도의 메모리 공간이 필요로 하는가?" 에 대한 내용입니다.
먼저 시간복잡도 입니다.
컴퓨터는 1초에 대략 3억번의 연산을 처리할 수 있습니다. (어떤 연산이냐에 따라 횟수는 달라지므로 3억번이 절대적인 수치는 아닙니다.)
만약 해당 문제의 시간 제한이 1초라면, 입력에 대해 3억번 이내의 연산횟수로 문제를 해결해야만 합니다.
1
2
3
4
5
6
7
|
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d\n", i * n + j);
}
}
|
cs |
위 코드를 실행한다고 합시다.
printf()함수는 총 \( n^{2} \) 번 호출되는 것을 알 수 있습니다.
\( n = 100 \) 이라면 총 10,000 번 연산하므로 1초 이내로 코드가 돌아가지만,
\( n = 1,000,000 \) 이라면 총 1,000,000,000,000 번 연산하므로 1초 이내로 코드가 돌아가지 않습니다.
우리는 이런 시간복잡도를 빅오 표기법(O)을 사용하여 나타냅니다.
\( O(n^{2}) \) -> \( 대략 n^{2} \) 회 정도 연산한다는 뜻입니다.
시간 복잡도 함수가 \( 2n+7 \) 과 같이 나올 수 있지만 빅오 표기법은 최고차항의 계수와 낮은 차수의 항을 제외시켜 간단하게 표기하는 방법입니다.
\( 2n+7 \) -> \( O(n) \) 과 같이 표현할 수 있습니다.
다음은 공간복잡도 입니다.
우리는 메모리 제한이 128MB 또는 256MB인 문제들을 만나게 될 확률이 높습니다.
프로그래밍 언어 기초를 배우셨다면 아시겠지만, 자료형 int의 크기는 4byte 입니다.
어떤 이유로 우리가 int형 배열을 10억 크기로 만들어서 문제를 푼다고 합시다.
이때 필요한 메모리 크기는 얼마일까요?
\( 4 \times 10^{9} byte \) 만큼의 메모리 크기가 필요할 겁니다.
메모리제한이 128MB 였다면 우리가 만들 수 있는 int형 배열의 크기는
\( 4 \times 32 \times 10^{6} byte \) 일겁니다. (실제로는 더 적은 크기를 선언할 수 있습니다.)
그러므로 10억 크기의 배열을 선언하는 방법이 아닌 다른 방법으로 문제를 해결해야겠죠?
지금 당장은 위 내용이 이해가지 않을 수 있습니다. 하지만 여러 알고리즘을 접해보고 문제를 해결하다보면 익숙해지고 편해집니다.
'Problem Solving > COALA 튜터링' 카테고리의 다른 글
3. (1) C++ STL (Standard Template Library) (0) | 2021.05.19 |
---|---|
2. 재귀 함수 (0) | 2021.05.03 |
1.-(2) 기본 정렬 알고리즘 - Bubble Sort (버블정렬) (0) | 2021.05.03 |
1.-(1) 기본 정렬 알고리즘 - Selection Sort(선택정렬) (0) | 2021.05.03 |