'알고리즘'으로 모든 문제를 해결할 수 있을까?? 아쉽게도 그렇지 않다. 의사결정을 위해서는 다양한 변수를 고려해야 하지만 정보의 부족과 시간제약으로 완벽한 의사결정을 할 수 없다. 우리는 실현 가능한 해답이 필요하다. 휴리스틱은 이런 경우를 위해 현실적으로 만족할 만한 수준의 해답을 찾는 것을 의미한다. 특히 경험이나 직관을 사용하거나 시행착오를 거쳐서 충분히 효율적인 해답이나 지식을 얻게 된다. 휴리스틱 알고리즘 중에서도 다가가기 쉬운 메타 휴리스틱 알고리즘에 대해 다뤄보자! 특정 문제에 특화되지 않고 자연에서 영감을 얻은 경험적 방법 & 휴리스틱 알고리즘 중 여러 도메인에서 활용할 수 있도록 일반화되어 발전된 알고리즘 휴리스틱 알고리즘에는 다양한 종류가 있는데 (1) 자연의 진화과정을 ..
전체 글
개발 블로그 💻👩💻이진탐색트리에 노드를 삽입/삭제/중위순회로 출력하는 코드입니다! 중요하게 봐야 할 곳은, 1. 아직 트리가 만들어지지 않았을 때 노드를 삽입하는 경우 2. 트리 삭제 시 노드를 찾았는데, 1.자식이 0개라면 node를 지운 후 해당 node를 nullpointer로 바꿔준다. 2.왼쪽 자식만 있다면 왼쪽 자식을 해당 노드로 바꿔준 후 찾았던 걸 삭제한다. 3.오른쪽 자식만 있다면 오른쪽 자식을 해당 노드로 바꿔준 후 찾았던 걸 삭제한다. 4.왼쪽 오른쪽 자식 둘 다 있다면 왼쪽 노드 중에서 가장 큰 값을 찾아서 그 노드로 바꿔준다. 3. 노드의 왼쪽 자식/오른쪽 자식으로 이동할 때 pointer 값!! (null pointer도 잘 생각해주자) main.cpp 파일 #include "binarysearc..
대뜸 다음 코드에서 값이 어떻게 나올지 예상해 보자. def spam(eggs): eggs.append(1) eggs=[2,3] ham=[0] spam(ham) print(ham) 그래, 배열은 메모리 주소값을 할당하는 거라고 했고, 함수 spam에 인수로 넣은 ham이 eggs가 되는 격이니까 답은 [2,3]! 이라고 했다면... ㅎㅎ이 글을 보게 된 것이 다행이다!! spam에 함수의 parameter는 eggs이다. 따라서 우리가 ham을 spam에 넣어준 동시에 함수의 parameter eggs는 ham 자체가 된다. 3행에서 eggs는 새로운 리스트를 만드는 코드이다. 그래서 이 경우, 더는 ham과 eggs와 같은 메모리 주소를 가리키지 않고 eggs는 자신만의 메모리 주소를 가지게 된다. 함..
먼저 python list의 메모리 관리 방식에 대한 이해가 필요하다. python에서 연산자 중에 '=='는 값을 비교하는 연산자이고, 'is'는 메모리의 주소를 비교하는 연산이다. 아래 코드를 보자.a=300 b=300 a is b #False a == b #True그런데 조금 다른 결과가 나타나는 경우가 있는데,a = 1 b = 1 a is b #True a == b #True엥? 이 때는 a와 b의 메모리 주소가 같은 걸까?? 이것은 파이썬의 정수형 저장 방식의 특성 때문인데, -5부터 256까지의 정수값은 특정 메모리 주소에 저장한 후 해당 숫자를 할당하려고 하면 해당 변수는 그 숫자가 가진 메모리 주소로 연결한다. 리스트가 위와 같은 메모리 저장 방식을 택하고 있다고 생각하면 되는데, 파이썬은..
순회방법 L: 왼쪽 이동 V: 노드 방문 (데이터 출력) R: 오른쪽 이동 재귀함수를 이용 순서만 주의하자! inorder(중위순회): LVR if (currentNode){ Inorder(currentNode -> leftChild); Visit(currentNode); Inorder(currentNode -> rightChild); } preorder(전위순회): VLR if (currentNode){ Visit(currentNode); Preorder(currentNode -> leftChild); Visit(currentNode); Preorder(currentNode -> rightChild); } postorder(후위순회): LRV if (currentNode){ Visit(currentNo..
들어만 봤던 Linked List를 드디어 보게 되었다!! 개인적으로 C++에서 가장 매력적으로 다가온 TOOL array의 한계를 해결할 수 있는 Linked List 데이터 입력 시 주소가 순차적이지 않아 요소를 메모리의 어느 곳에나 둘 수 있음 (크기를 동적으로 할당 가능) 연결리스트 구현에서 유념해야 할 것 1. 연결리스트의 연결을 끊지 않게 주의하자. 2. 연결리스트에서 next link의 pointer를 지정할 때 아예 노드의 저장소 자체를 변화시키지 않도록 주의하자. 1번은 그냥 실수를 안 하면 되는 문제이고, 2번의 경우 개념에서 헷갈릴 수 있다. class ChainNode { friend class Chain; public: ChainNode (int element=0, ChainNod..
Template을 쓰는 가장 강력한 이유는 바로 '어떠한 타입으로도 인스턴스화 가능'하다는 것이다. 인스턴스를 가장 잘 설명하는 예시는 Bag a; Bag r; 우리는 Bag을 이용해 형 객체뿐만 아니라 형 객체도 만들 수 있다! PPT 템플릿 왜 갖다 쓰는지 생각해봐라 누군가가 템플릿으로 만들어주거나 만든 템플릿을 잘 활용할 수 있다면 나는 그저 선언하고 사용하는 것만으로도 설계 구조까지 통째로 가져다 재사용할 수 있다는 장점이 있다. Template을 이용해 Stack 구현하기 코드에서 집중적으로 볼 것 Template이 어떻게 쓰였는가? Push와 Pop에는 각각 ++, --연산자가 다르게(전위,후위) 쓰였음을 주의하자. #include #include #define SIZE 10 using nam..
희소행렬 전치 시간복잡도 O(Col X Terms) #include #define MAX_TERMS 101 typedef struct { int row; int col; int value; } element; typedef struct SparseMatrix { element data[MAX_TERMS]; int rows; // 행의 개수 int cols; // 열의 개수 int terms; // 항의 개수 } SparseMatrix; SparseMatrix matrix_transpose2(SparseMatrix a) { SparseMatrix b; int bindex; // 행렬 b에서 현재 저장 위치 b.rows = a.rows; b.cols = a.cols; b.terms = a.terms; if ..
오버로딩 구현 방법? C=A.add(B) 이런 함수를 만들어보고 싶었다...!!🤔
#include using namespace std; void swap(int& a, int& b) { int temp = a; a = b; b = temp; } void Permutations(char* a, const int k, const int m) { if (k == m) { //순열 출력 for (int i = 0; i
*자주하는 실수 cout이나 cin 같은 거 쓸 때 맨 위에다가 이거 넣는 거 잊지 말자!! #include using namespace std; if 다음에 (조건문) 조건문은 괄호로 감싸주자!! 이원탐색 #include using namespace std; int BinarySearch(int* a, const int x, const int n) { int left = 0; int right = n - 1; while (left a[middle]) left = middle + 1; else return middle;//찾았다. } //없다 return -1; } int main() { int List[] = { 1,2,3,4,5,7,9,10 }; cout
#include using namespace std; void swap(int& a,int& b) { int temp = a; a = b; b = temp; } int main() { int a[10] = { 1,10,5,8,7,6,4,3,2,9 }; for (int i = 0; i < 10; i++) { int j = i; for (int k = i + 1; k < 10; k++) if (a[k] < a[j]) { j = k; } swap(a[i], a[j]); } for (int i = 0; i < 10; i++) { cout
뭐든 기초를 확고히 하자. 자료구조가 바로 그 기초의 근간!! 알고리즘 실력을 늘릴 수 있을 것 같은 과목이다.. 프로그래밍 언어를 접하고 코드를 기술하기 이전에 꼭 알고 넘어가야 하는 기초가 있다. 시스템 생명주기 요구사항 모든 경우에 대한 입력과 출력을 정밀하게 기술한다. 분석 문제를 작은 단위로 나누어 상향식/하향식 접근 방법으로 세분화한다. 설계 objects와 operations를 나누는 관점에서 시스템에 접근한다. 다르게 표현하면 objects는 과목, 학생, 교수이고 operations는 삽입, 삭제 등이 될 수 있다. 설계 시 구현(implementation)을 위한 결정 사항들, 예를 들어 트리를 쓸지, 전화번호 데이터도 포함시킬지 등은 가능한 뒤로 미룸으로써 선택한 언어의 범주 내에서 ..
class와 queue 개념을 활용하여 카드를 정렬하는 알고리즘 학교 과제로 해결했던 카드 정렬 알고리즘에서 원형큐를 잘 이해해버린 것 같다! 평소 python에서 쓰던 .popleft() .append .pop(3) 이런 함수들을 내가 구현해버린 기분.. 😋 queue.h #include using namespace std; class CircularQueue { private: int queue[6] = {}; int front; //front = 0 으로 초기화 int rear; //rear는 꼬리로 배열이 차있는 영역까지라고 생각하면 된다 int maxQueueSize; public: CircularQueue(int); void isEmpty(); void isFull(); void enQueue..
카카오인턴 2022 05 07 후기! 시험은 2시부터 7시까지 5시간동안 진행되었다. 생각보다 5시간 집중하는 게 쉽지 않았다.! 1 1솔 2 1솔 3 ㅠ 4 0.5솔 5 0.5솔 4,5번은 구현은 했지만 효율성에서 몇 개를 통과를 못 했다ㅠㅠ 일단 5번은 뭔가 사람들이 다 잘 풀었을 것 같아서 합격은 장담이 안될 것 같다. 그래도 아직 시간 많으니까 좋은 경험이었다. 문제를 풀어보면서 일단 4번에서 다익스트라 알고리즘이 나온 것 같은데 이 문제를 풀면서 다익스트라에 대한 이해도가 좀 더 높아진 것 같다(heap을 사용할 때 최소힙 최대힙 쓰자고 했던 것들을 막상 구현할 때 좀 생각을 못 한 것 같아서 아쉽다ㅠㅠ) 그리고 공부할 때 가끔 문제를 좀 선별해서 풀다보니까 도형 쪽 공부는 안 해왔던 게 탄로나..
이전에 개발 블로그 / 코딩 블로그 의 필요성에 대한 말은 많이 들었으나 굳이 필요성을 느끼지 못했다. 내가 너무 보여주기식이 될 것 같기도 하고 그거 쓸 시간에 다른 거 고민하는 게 나을 것 같다고 느꼈는데, 여러 선배님들과 이야기하고 또 주변 소프트웨어학과 분들이랑 이야기하다 보니까 개발 블로그의 필요성을 느꼈다. 주관적인 생각으로는 1. 체화하기 좋다. 간단히 CSS 적용 과정에서 화면 안에서 위치를 조정시키는 문제는 진짜 무슨 맨날 google 들어가서 검색한다..ㅠㅠㅠ 그럴 때, 내가 한 번 이전에 공부하면서 쫙 정리했던 내용이 있으면 가져오거나 이해하는 데에 도움이 많이 될 것 같다. 상황에 따라서 우리가 적용하는 함수들이 또 다르기 때문에 그 상황을 이해하고 적용하는 데에도 블로그 글이 많이..