목록내 개인적인 공부 (60)
그냥 게임개발자
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/9TCfm/btsGM2C7jxa/XRYrG3aqaEZtWd87DSRhyk/img.png)
이제 순열을 배웠기 때문에 조합을 알아봅시다. 순열은 "순서"가 있었죠? 조합은 "순서가 없습니다! 그저 n개에서 r개를 뽑는게 다입니다. 순서를 지킬 필요가 없죠. 순서를 지킨다면 nPr(Permutation) 즉 순열을 사용하면 되며, 그게 아니라면 nCr(Combination)을 사용하면됩니다. n개중에 순서없이 r을 뽑는다. 할 때, 예를 들어 3개중에 2개를 뽑는다라고 하면 n은 3이되며 r은 2가됩니다. 3! / 2!(3-2)!가 되며 3 * 2 * 1 / 2 * 1(1)이 됩니다. 그러면 분자에 2 * 1과 분모의 2 * 1은 나뉘어지어 사라지고 3 / 1 이되어 3개가 나온다라는 소리입니다. 쉽네요. 코드로 해볼까요? #include #include using namespace std; i..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dNkwFD/btsGLGtZiOO/qfNY7HhjkGiRhkgkYnU6D1/img.png)
요새 바빠가지구 포스팅을 잘 못했네요 호호.. 피곤에 쪄들었어요. 그래도 다시 마음잡고 열심히 공부해야죠! 사람이 12명씩 서로 2명씩 인사하면 몇 가지의 경우의 수가 나오나요? 바로 66가지의 경우의 수가 나옵니다. 경우의 수를 구할 때 보통 순열과 조합을 이용합니다. 먼저 순열부터 알아보시죠. 순열(Permutation)이란 순서가 정해진 임의의 집합을 다른 순서로 섞는 연산을 말합니다. 예를 들어 1, 2, 3이 있으면 1, 3, 2 2, 1, 3 뭐 이런식으로 말이죠. 그리고 n개의 집합 중에서 n개를 고르는 순열의 개수는 n!(팩토리얼)이라는 특징을 가지고 있습니다. 그러면 위에 예시처럼 1, 2, 3을 통해 만들 수 있는 3자리는 과연 몇 개 일까요? 123, 132, 213, 231, 312..
#include using namespace std; int number; void solve(int n) { int sum = 0, i = n; while (i > 0) { sum += i; i /= 2; } cout number; solve(number); return 0; } 이것을 보면 시간복잡도만 결론으로 이야기하면 O(logN)입니다. log는 알 거라고 생각하고 이야기 할게요. 만약 number가 32라고 칩시다. 그러면 solve에서 더해주는 게 32 + 16 + 8 + 4 + 2 + 1입니다. 그러면 총 5번을 하게 되죠? 그러면 이 log를 써봅시다. 밑이 2인 log2(32)는? 5죠 지수는 32인거구요. 그래서 log2(N)인데 상수또한 빼주어서 총 시간 복잡도는 logN이 되는겁니..
#include using namespace std; int arr[100]; int cnt; int SumAdd(int l, int r) { cnt++; if (l == r) return arr[l]; int mid = (l + r) / 2; int sum = SumAdd(l, mid) + SumAdd(mid + 1, r); return sum; } void main() { int number; cin >> number; for (int i = 0; i < number; ++i) { arr[i] = i + 1; } int sum = SumAdd(0, number - 1); cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/d9mnb8/btsGCdEgZIY/K2KY07AMBSYk2vPPrN0b4k/img.png)
Array요소 수정할 때 크기를 정하지 않은 int arr[], 또는 배열의크기인 int arr[3], 배열의 포인터인 int* arr를 넘겨서 수정이 가능하다. #include using namespace std; int arr[3] = { 1, 2, 3 }; void Check1(int a[]) { a[2] = 100; } void Check2(int a[3]) { a[2] = 1000; } void Check3(int* a) { a[2] = 10000; } int main() { Check1(arr); cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cASfkS/btsGComlwZk/wLEJY9Zs5Xk8uidVCrhpi0/img.png)
재귀함수란 3가지 특징을 가집니다. 재귀함수(Recursion)는 정의 단계에서 자신을 재참조하는 함수 전달되는 상태인 매개변수가 달라질 뿐 똑같은 일을 하는 함수 큰 문제를 작은 부분문제로 나누어서 풀 때 사용합니다. 예를 들어 팩토리얼(factorial)이 있습니다. 팩토리얼(factorial)은 1부터 해당 항까지 곱하는 함수입니다. 이를 재귀함수로 구현하면 다음과 같습니다. 근데 이거 고등학교인가 중학교인가 그 때 배웠던 것 같은데요. 코드로 활용해봅시다. #include using namespace std; // 재귀함수 int FactRec(int n) { if (n == 1 || n == 0) return 1; return n * fact_rec(n - 1); } int FactFor(int..
우리가 함수에 매개변수를 넣어 매개변수를 사용합니다. 근데 이와 같은 코드는 어떤가요? 값에 의한 호출 #include using namespace std; int add(int a, int b) { a += 10; cout