본문 바로가기

CS

(56)
객체지향 프로그래밍 - 상속 (java) 상속받은 자식 : 부모의 메소드 + 변수 상속의 장점 : 코드의 재사용, 유지성 향상 부모가 수정되면 자식도 수정된 방식을 따를 수 있음 자바는 다중 상속을 지원하지 않는다. 부모는 1개 . 자식을 생성할 경우 부모의 생성자는 자동으로 실행된다. 우리는 부모의 생성 파라미터가 있다면 그것도 충족해줘야한다. 메소드 오버라이딩 : 부모의 메소드를 자식에서 새로 정의 메소드 오버로딩 : 같은 클래스에서 같은 이름이지만 다른 파라미터를 받을 수 있음 오버라이딩시 선언이 자식 클래스이면 자식의 메소드를 따름. final 클래스는 자식을 가질 수 없음 protected : 자식 클래스에서만 접근할 수 있는 변수 같은 패키지에서는 접근이 가능
객체지향 프로그래밍 - Object, Class classname name = new classname() -> new 연산자는 클래스의 생성자를 call, name은 포인터로 classname으로 만들어진 객체를 가리킨다. 새로운 object가 생성된다. 각 자바 클래스당 메인은 한개 Main는 실행 클래스 아닌 다른 클래스는 모두 라이브러리 클래스로 불린다. Member in Class - 변수 - 메소드(function) - 생성자(Constructor) Local variable , public variable - 지역변수 : 오브젝트 종속 변수 - 필드 : 오브젝트(클래스)에 선언되어있는 변수 Overloading - 오버로딩은 같은 이름의 메소드인데 다른 파라미터를 받을 수 있는 방법이다. 이는 생성자, 메소드 모두 가능하다. 이는 다형성이..
머신러닝 - 최대우도법, 최대사후확률 데이터로부터 확률을 추정하는 것은 머신러닝의 기본이다. 여기에는 최대 우도 추정 MLE, 베이지안 추론 및 빈도 기반 방법을 포함하여 데이터에서 확률을 추정하는 방법 등이 있다. Ex) 동전을 던졌을 때 앞면 뒷면이 나올 확률 1. 편향성(bias) 당연히 상식적으로 생각하면 50퍼센트이지만 자연은 그렇지 않다. 10번을 던졌다면 앞 7번 뒤 3번 나올 가능성도 충분히 있다. 여기서 앞면이 나올 확률을 a 라하면 뒷면이 나올 확률은 1 - a 이다. 편향성을 추정하는 방법으로 베이즈 추정 방법이 있다. 베이즈 추정 방법은 사전 정보와 실제 결과를 결합하여 편향성을 추정하는 것이다. * 최대우도법(MLE) - 확률 분포 모델의 모수를 추정하는 방법 중 하나이다. MLE는 데이터의 Likelihood를 최대..
객체지향 프로그래밍 - 집합관계 : 완성품과 부품의 관계 ex) 자동차 , 엔진, 타이어 - 사용관계(의존성) : Object를 사용하는 주체 - 상속 : 부모와 자식, 자식은 부모의 속성을 갖는다. 상속은 코드의 재사용을 가능하게 한다. 코드의 유지보수 시간을 줄일 수있다. - 캡슐화 : 메소드와 변수를 바인딩. 사용자는 어떻게 작동하는지 알 필요가 없다. - 다형성 : 오버로딩, 오버라이딩을 이야기함. 오버로딩은 같은 이름의 받는 파라미터가 다름, 오버라이딩은 "부모"의 메소드를 변형하여 사용하는 것이다. 파라미터 타입과 함수 타입도 동일해야한다. - 클래스와 오브젝트 : 클래스는 설계도 오브젝트는 그 설계도로 만든 실제 구현물을 이야기한다. 오브젝트는 실제로 구현할 수 있는 모델을 뜻한다. ex) 자동차 그리고 인스턴..
멀티코어 컴퓨팅 - Create a Parallel Program 멀티코어 컴퓨팅의 궁극적 목표는 결국 Better Perfomence 를 내는 것이다. 이름과 마찬가지로 a + b c + e 위 코드를 병렬 컴퓨팅 처리해서 한번에 계산하면 연산 속도는 2배 빠를 것이다. 1. Decomposition 처리할 작업을 분류한다. A라는 거대한 작업이 있다면 이를 a b c d로 분류하는 것이다. 이 때 a b c d중 어떤 작업을 병렬처리할 수 있는지도 분류하는데 이때 병렬처리 가능한 부분이 클 수록 성능개선치가 높아진다. - Amdahl's Law 성능 개선치 예상 공식 이때, 프로세서가 2억개 있어도 순차처리가능 부분은 무조건 25초가 걸린다. 그러나 병렬처리가 가능한 부분은 거의 0초로 줄일 수 있다. Speed Up = old running time / new r..
문자열 관리 자료구조 - 트라이(Trie) 개념/구현 C++로 PS를 공부할 때나 코딩테스트를 볼 때 문자열 문제가 나오면 일단 짜증이난다. 파이썬은 문자열 다루기가 편하다는데 C++는 아무래도 문자열을 다룰때 힘든 면이 많다. 문자열 문제가 나오면 파이썬을 쓰고 다른 문제에선 C++을 쓰는 사람도 있을 정도다. 아무튼, 트라이는 문자열을 다루는 방식 중에서도 특히 문자검색을 할 때 가장 유용하고 효과적인 자료구조가 바로 트라이 이다. 먼저 트라이는 문자열로 트리를 만든다고 보면 된다. AB, ABC, BCD, ABD 라는 단어가 들어온다고 치자. 그렇다면 root / \ A B / \ B* C / \ \ C * D* D* 이런식으로 트리를 구성한다. 이렇게 하고 단어가 끝나는 글자들에는 표시를 해둔다. 즉 , 단어를 찾을 때 표시가 되어있는 글자라면 끝났..
DFS를 활용한 순열 이전에 dfs를 활용한 조합을 봤습니다. 순열도 비슷한 방식으로 백트래킹을 사용합니다. 조합과 순열의 가장 큰 차이는 순서입니다. 조합은 1 2 3, 1 3 2 가 같지만 순열은 다르다고 봅니다. 때문에 조합은 idx라는 인수를 갱신하면서 1 2 3 에서 2개를 뽑는다고 치면 1 2, 1 3 하고 끝! 이었습니다. 그러나 순열은 순서를 중요시 생각하기 때문에 2 부터 시작하는 순서도 2 1 가 나와줘야합니다. 이를 이해해야합니다. #include #include #define MAX 4 using namespace std; vector num; vector result; bool visited[5] = { false, }; void dfs(int cnt) { if (cnt == MAX) { for (in..
유클리드 호제법(Euclidean algorithm) - 최대공약수, 최소공배수 알고리즘 최대공약수는 암호학에도 자주쓰이고 알고리즘 문제를 풀 때도 자주 등장합니다. 우리가 초등학교 때 배웠던 최대공약수 구하는 법은 ex) 4 8 이라 하면 두 수가 공통으로 나누어질 것 같은 수를 나눕니다. 2로 나누겠죠. 그럼 2 4 가 되고 이를 또 2로 나누면 1 2 가 되며 이때 마지막으로 더 나누어지는 수가 없으면 지금까지 나눈 수들을 곱한 값이 최대공약수 입니다. 이는 사람머리로는 간단하지만 알고리즘적으로 생각하면 복잡합니다. 이를 타개하기 위해 무려 기원전 유클리드라는 천재가 발명한 것이 유클리드 호제법 입니다. 먼저 유클리드 호제법의 원리는 다음과 같습니다. 1980 , 168 의 최대공약수를 구한다면 1980 % 168 = 132 -> 나누어 떨어지지 않습니다. 즉 최대공약수는 168이 아닌..