반응형

알고리즘 공부/알고리즘 17

재귀 함수 C++

개요함수란 무엇인가? 코드를 기능 단위로 묶어둔 것이다.return type funcname() { body}와 같은 형식을 가진다. 지역/전역/함수를 사용할때 어떤 메모리 영역에서 쓰이는지 잘 구분해야 한다. 재귀는 다시 돌아오다 라는 뜻으로 재귀 함수는 다시 돌아오는 함수이다. 즉 다시 실행되는 함수 (run / recall)재귀 함수는 자기 자신을 리턴 혹은 호출 하므로 종료 조건을 설정하지 않으면 원하는 의도가 나오지 않을 가능성이 매우 높다. (함수를 호출하는 것 자체가 메모리를 사용하는 것이므로 while처럼 무한루프에 빠지진 않을 것이다.)따라서 재귀 함수를 사용할 당시엔 종료 조건을 설정해 주어야 한다. 예제1. 무한 루프코드#include using namespace std;void he..

그리디 알고리즘 Greedy Algorithm C++

개요문제를 풀이할 기준을 세운다.Greedy Choice Property : 세운 기준이 변경되면 안된다.Optimal Substructure(부분 최적해) : 수립한 기준을 검증할 수 있어야 한다.부분 최적해를 통해 앞서 계산된 결과를 다른 부분에서도 그대로 가져가서 쓸 수 있다면 그리디 알고리즘이 성립된다.그리디 알고리즘은 수학적으로 검증이 가능하다. 예제1. ATM 문제ATM이 1대가 있을때 A, B, C 인원 세명이 ATM을 이용하려고 한다. ATM 이용 시간은 각자 A = 30분, B = 20분, C = 5분 이라고 가정할때 이때 총 걸리는 대기 시간은?1. 문제 인식 : 대기 인원수는 ATM을 사용할 수록 줄어들고, 대기 시간은 점점 늘어난다.2. 기준 수립 : ATM 이용 시간이 적은 순서대..

정렬 Sort C++

개요정렬은 배열이나 벡터의 인자들을 내가 원하는 대로 순서를 재배치 할 수 있다.C++에서는 algorithm 클래스를 include 해주어야 사용 가능하고 파이썬의 경우에는 내장 함수로 사용 가능하다.lambda등과 결합하면 꽤나 큰 효과를 볼 수 있다. 예제1. 배열의 정렬코드#include #include using namespace std;int arr[11] = { 1, 33, 77, 13, 21, 67, 91, 21, 17, 93, 99 };int main() { sort(arr, arr + 11); for (int i = 0; i  출력1 13 17 21 21 33 67 77 91 93 99 2. 벡터의 정렬코드#include #include #include using namespace st..

문자열 String C++

개요C++에서는 문자 배열을 사용하지 않고 string 메서드를 include하여 사용할 수 있다.해당 기능을 사용한다면 문자열 찾기, 문자열 잘라내기 등에 대한 기능을 사용할 수 있으며, 굳이 기능을 사용하지 않더라도 string을 사용 가능하다. 예제1. 복사 및 비교여타 다른 변수와 동일하게 특정 변수의 값을 다른 변수에 대입하여 복사할 수 있다. 코드 string a = "AAA"; string b = ""; b = a; if (b == a) cout  출력AAA : AAA 2. 문자열 더하기"AAA" + "BBB" = "AAABBB" 이다. 코드 string a = "AAA"; string b = ""; b = a; string ans = a + b; ..

벡터 Vector C++

개요배열과 달리 동적 할당이 가능하도록 지원하는 클래스(STL), 배열과 별개로 활용 방법이 무궁무진 하다. 벡터의 기본형과 자주 사용하는 메서드#include #include using namespace std;vector v; // vector 이름;int main() { // 벡터의 뒤에 값을 추가한다. v.push_back(10); // 벡터의 가장 뒤에 있는 값을 삭제한다. v.pop_back(); // 벡터의 크기를 재할당 한다. v.resize(10); // 벡터의 모든 요소와 크기를 지운다. v.clear();}  장점배열과 달리 동적으로 메모리를 제어할 수 있다.다양한 기능의 메서드 지원으로 원하는 바를 구현하기에 편리하다.파이썬의 리스트와 유사한 점이 있다.예시 코드 1차원 벡터 초기화..

방향 배열

개요현재 위치 기준으로 상하좌우로 움직이는 것을 편하게 만들어 주는 배열을 만들어 놓고 재사용 한다.만약 4방향 배열을 탐색할때 현재 위치가 배열의 가장자리라면 일부 방향으로의 탐색은 out of range 에러를 노출 하거나, 배열과 전혀 다른 메모리를 참조할 수 있으므로 if문을 통해 적절히 범위를 제한해 주어야 한다.  장점불필요한 if문을 남발할 필요가 없다.코드를 간결하게 표현할 수 있어 가독성이 좋다.유지 보수 하기 쉽다. 적용4방향 배열1int dy[] = { -1, 1, 0, 0 };int dx[] = { 0, 0, -1, 1 }; 4방향 배열 탐색 로직1int main() { vector> lst = { {1, 2, 3}, {4, 5, 6}, {7, 7, 7} }; int sum =..

DAT (Direct Access Table) 배열 활용법

개요DAT란 배열의 인덱스를 "의미 있게" 활용하게 하는 배열 활용법이다.조회가 잦은 데이터인 경우, DAT 테이블을 만들어서 관리한다.  장점중복 반복문의 경우 시간 복잡도는 조회 회수 * 데이터의 개수이다.DAT의 경우 조회 회수 + 데이터의 개수로 방문해야할 데이터의 개수가 많을 경우 시간복잡도 측에서 큰 차이가 난다.  활용존재 유무, counting등에 활용된다. BFS나 DFS를 구현할때 방문 처리를 하는 것도 DAT에 해당된다. 정수형 탐색입력 가능한 정수의 범위 만큼 DAT배열을 초기화 한다, 입력 받은 숫자의 index를 특정 값으로 설정할 경우 해당 숫자가 배열 안에 존재하는지 O(1)의 시간 복잡도로 확인할 수 있다.만약 Counting이 필요한 케이스의 경우 입력 받은 숫자의 ind..

728x90
반응형