목록전체 글 (99)
한다 공부
브루트 포스란 무엇인가? 모든 경우의 수를 다 해보는 것이다. 이런 단순한 방법이 때로는 가장 합리적인 방법일 수도 있다. #include #include using namespace std; vector num; //삼각수를 벡터에 push_back void calc() { int sum = 0; int k = 1; while (sum < 1000) { sum += k; num.push_back(sum); k++; } } //세 삼각수의 합이 입력한 수이면 true 리턴 bool check(int n) { bool c = false; for (int i = 0; i < num.size(); i++) { for (int j = 0; j < num.size(); j++) { for (int k = 0; k..
이진 분류란 샘플 데이터를 True나 False로 구분하는 문제를 말한다. 이러한 이진 분류를 위한 알고리즘이 많이 존재한다. 퍼셉트론 초반 1957년에는 퍼셉트론 알고리즘이 발표되었다. 퍼셉트론은 3장의 선형 회귀와 유사한 구조이다. 입력신호를 받아 z를 만들고, 다시 z를 계단함수를 통해 -1 (0보다 작을 때) 또는 1 (0보다 크거나 같을 때) 로 출력을 해준다. (입력 -> z -> y_hat) 이때 -1 또는 1로 출력된 y_hat을 역방향 계산하는데 사용해서 가중치와 절편을 업데이트시키며 학습하는 데에 사용해나간다. 선형 회귀와 다른 점은 입력 신호가 많다는 점이다. z=b+w1x1+...+wnxn 으로 나타낼 수 있는데 이를 시그마를 이용해서 나타내기도 한다. 아달린 1960년에 퍼셉트론을..
에라토스테네스의 체란 무엇일까? 소수를 판단할 때 유용하게 쓰인다. 소수란 1과 자기자신으로만 나누어지는 수이다. 2 3 5 7... 등이 있다. 2부터 생각을 해보자. 2는 소수이다. 2*n배는 소수가 아니다. 그렇다면 2*2, 2*3, 2*4.... 2*(n) 은 모두 소수가 아니므로 제거한다. (코드에서는 bool형 배열을 false함으로써 제거) 그리고 3도 같은 방법으로 3의 배수들을 false한다. 4의 경우 이미 2*2에서 false되었으므로 5를 확인한다. 이런식으로 계산을하면 소수 2 3 5 7..은 남아있고, 소수가 아닌 어떤 수들의 배수들인 4 5 8 9 10... 은 false처리되며 제거된다. 이 방법으로 소수 판정을 하면 O(nlog(log n))만에 가능하다. false로 바꿔..
GCD(Greatest Common Divisor) GCD란 최대공약수를 의미한다. 최대공약수를 구할 땐 유클리드 호제법을 이용하는게 편하다. 유클리드 호제법이란, a b의 최대공약수가 a%b(나머지) b의 최대공약수가 같다는 것을 이용하는 것이다. 예를 들어 15와 10이 있다고 해보자. a=15, b=10이라고 하면 a%b=5, b=10이 된다. 이 a%b값을 a에 대입하자. x%y를 할 때에는 x>y여야하므로 둘의 자리를 바꿔줘야한다 그러면 a=10, b=5가 된다. 나머지가 0이 될 때까지 해보자. a%b=5, b=5가 된다. a%b를 a에 대입하면 a=5, b=5가 되고 a%b = 0이 된다. 0이 되면 작은 값인 b를 리턴한다. 그러면 최대공약수가 b값, 즉 5가 된다 예를 들어 7과 3이 있..
수학시간에 하던 combination, 조합을 구하면 된다. 재귀함수 등 풀이법은 많은 것 같지만 나는 while문과 for문을 썼다. 어렵지 않게 풀었다. #include using namespace std; int main() { int n, k, temp;; cin >> n >> k; temp = k; int a = 1; while (temp--) { a = a * n; n--; } int b = 1; for (; k > 0; k--) { b = b * k; } cout
다른 사람들이 신청한 마일리지를 temp라는 최소 힙으로 담았다. 만약 3명만 수강신청 가능할 때, 5명이 신청을 했다고 해보자 마일리지를 5 10 15 20 25를 담았다고 치면 이를 최소 힙 temp 에 담아서 정렬한다. 그리고 내가 신청을 하기 위해, 오버된 만큼을 힙에서 pop 시킨다. 5-3, 즉 2만큼 pop해보자 15, 20, 25 만 남았다! 같은 마일리지를 할당해도 내가 우선시 되므로 15, 20, 25 할당된 수업에서 내가 수강신청하려면 15만 할당해도 된다. [결론] 1. 인원이 널널하면 마일리지를 1만 할당, 최소힙 q에 1을 담는다. 2. 5명 신청가능한데 5명이 신청한 경우, 최소힙temp에 5명의 마일리지를 넣어서, 최소 마일리지 넣은 애를 구하고, 최소 만큼만 내가 할당한다...
이 문제를 풀기 위해 음수 힙과 양수 힙, 두개를 선언했다. 최소 힙 두개를 만들었는데, priority_queue p; 를 이용하면 최소 힙으로 만들 수 있다. 이 때 vector 는 include 하지 않아도 되고, push와 pop 같은 연산은 priority_queue p; (최대 힙) 을 이용할 때 처럼 p.pop(); 등 으로 해주면 된다. #include #include using namespace std; int main() { //p에는 양수인 것들을 최소 힙으로 저장 //m에는 음수인 것들의 절댓값을 최소 힙으로 저장 priority_queue p; priority_queue m; int n; cin >> n; int q; int k; while (n--) { cin >> q; if (..
3장에 대해 이야기를 하기 전에 머신러닝과, 인공지능에 관련된 용어를 정리해보자 [머신러닝] 우선 기계학습 (=머신러닝은) 학습 방식에 따라 크게 지도학습(supervised learning) - 회귀(regression), 분류(classification) 비지도학습(unsupervised learning) - 군집화(clustering), 변환(transform), 연관(association) 강화학습(reinforcement learning) 으로 나누어진다 지도학습이란 훈련데이터(입력, 타깃으로 구성)를 사용해 모델(학습을 통해 만들어진 프로그램)을 훈련시키는 것이다. 예를 들면 (입력 => 습도가 nn) 을 통해 (모델로 예측 => 비가 올지, 안올지) 훈련시키는 것이다. 비지도학습은 쉽게 말하..
딥러닝 공부를 해보자! 공부를 하기 앞서, 딥러닝을 구현하기 위한 패키지로는 numpy와 matplotlib가 있다. numpy란, list로 구현하면 성능이 떨어지는 크기가 큰 배열들을 높은 성능으로 사용할 수 있게 하는 패키지이다. import numpy as np #numpy라는 패키지를 np라고 별칭 print(np.__version__) #잘 출력되면 import 성공 #넘파이란, 배열의 크기가 커져도 높은 성능을 보장한다. #배열을 이용한 다양한 통계, 수학 함수도 제공하나. my_arr=np.array([[10,20,30],[40,50,60]]) #넘파이의 array함수를 이용해 배열 만들기 print(my_arr) #넘파이 요소 삽입 my_arr[0][2]=300 print(my_arr) ..
문제가 많이 긴데 결론은 문자열을 자바스타일에서 c++스타일로, 혹은 그 반대로 변환하면 되는 문제다 c++ 스타일의 문자열은 소문자와 언더바로 구성되는데 이 언더바가 오류를 많이 발생시킨다. _c도 에러 (시작이 언더바) c_도 에러 (마지막도 언더바) c__c도 에러다. (언더바가 두 번 나와도 에러) #include using namespace std; string ctoj(string name) { string j; for (int i = 0; i < name.length(); i++) { if (name[i] == '_') { j += name[i + 1] - 32; i++; } else j += name[i]; } return j; } string jtoc(string name) { strin..