목록자료구조 (22)
without haste but without rest
전역변수를 사용하는 스택 #include #include #define MAX_SIZE 5 /* 전역 변수를 사용하는 배열 스택 단점 1. 전역 변수를 많이 사용한다. 해결 방법 1. 구조체를 활용해서 전역 변수 사용을 줄인다. */ typedef int element; // element is data tpye of stack, it is easy to adjust code element stack[MAX_SIZE]; int top = -1; int is_full(); int is_empty(); void push(element item); element pop(); element peek(); int main(void) { for (int i = 1; i
ADT 구현, 사각형 문제 #include #include typedef struct _coordinates { int x; int y; } Point; void input(Point *p); void output(Point p); double distance(Point pt1, Point pt2); int area(Point pt1, Point pt2); int equals(Point pt1, Point pt2); void move(Point* pt1, Point vec); int test() { Point p1, p2, vec; printf(">>"); input(&p1); printf(">>"); input(&p2); if (equals(p1, p2)) { printf("두 점이 같습니다."); r..
#define _CRT_SECURE_NO_WARNINGS #include void move(int n, char from, char to) { printf("원판%d을 %c에서 %c로 이동합니다.\n", n, from, to); } void hanoi_tower(int n, char from, char tmp, char to) { if (n == 1) move(n, from, to); else { hanoi_tower(n - 1, from, to, tmp); move(n, from, to); hanoi_tower(n - 1, tmp, from, to); } } int main(void) { hanoi_tower(3, 'A', 'B', 'C'); return 0; }
C 로 그래프를 구현하는 중에 이해를 못하는 상황이 발생했다. 파이썬은 딕셔너리 구조를 이용해서 정말 쉽게 구현했고, 메모리 관리를 따로 안 해줘도 되니까 구조 자체에만 집중할 수 있었다. 온라인 강의를 보면서 굉장히 비효율적인 공부를 하다가, 혼자 그래프를 그려보고 직접 생각하면서 이를 코드로 구현하는 게 역시나 정석인 것 같다고 판단했다. 결론: 노트에 구조를 그려보고, 여기에 맞춰서 코드를 짜는 게 오래 남는다. 코드로 그래프를 구현한다는 것은 사람이 눈으로 인식하는 것과는 차이가 있다. 그래프 구조의 특징은 노드가 가지는 숫자가 노드의 개수보다 크지 않고, 중간에 비는 숫자가 없다. (만약 노드가 갖는 숫자가 1부터 순차적인 숫자가 아니라 중간에 훅 건너 뛰는 경우는 배열의 크기를 늘리는 방법을 ..
재귀 용법(Recursive Call) 이미지를 보면 프로그램 속에서 프로그램을 실행했다. 다시 프로그램 속의 프로그램 속에서 프로그램을 실행했다. 이게 재귀다. 함수 안에서 다시 똑같은 함수를 불러와서 재사용한다. *주의할 점은 항상 종료 조건을 만들어줘야 한다. 무한 루프에 빠진다. # Recursive def recursive(data): if data == 0: return print(data) recursive(data -1) print('Number is ', data) #Test Code recursive(5) 위 코드를 실행하면 아래처럼 출력된다. Number is .. 가 왜 역순으로 출력이 되는지 생각해보면 재귀를 이해하는 데에 도움이 된다.
힙(Heap) 힙은 최대값과 최소값을 빠르게 찾기 위한 이진 트리다. 이진 탐색 트리(Binary Serach Tree)처럼 동일한 이진 트리라는 공통점이 있다. 하지만 트리와 힙은 다르다. 가장 큰 차이점은 힙의 경우 최대값이나 최소값이 루트 노드에 자리잡고 있다는 것이다. 또한 이진 탐색 트리의 경우 링크드 리스트 구조로 각 노드를 연결하는 반면 힙은 배열을 이용한다. 위 이미지의 구조가 트리였다면 level 2에 위치하는 3과 1은 왼쪽 노드에 존재해야한다. 하지만 힙은 삽입 데이터의 크기에 따라서 좌우 정렬을 하지 않는다. 목적 자체가 최소, 최대값을 빠르게 찾기 위함이기 때문에 최대값, 최소값을 루트 노드에 위치 시키는 것이 가장 중요하다. (위 이미지의 경우 최대 힙이므로 자식 노드는 부모 노..
트리(Tree) 트리는 노드(Node)와 브랜치(Branch)로 구성되어있다. 위 이미지에서 원이 노드, 화살표가 브랜치다. 각 노드들은 링크드 리스트 구조로 연결되어 있으며, 싸이클이 없다. 마지막 데이터에서 처음 데이터로 돌아오지 않는다. 아래 애니메이션을 보면 이진 탐색 트리 구조에서 데이터가 어떻게 삽입되는지 쉽게 이해할 수 있다. 21보다 작으면 왼쪽으로, 크면 오른쪽으로 이동한다. 그리고 다음 노드를 만나서 이 단계를 반복한다. 만약 더 이상 비교할 데이터가 없으면 해당 위치에 데이터가 삽입된다. 위 애니메이션에서 21은 루트 노드(Root Node)에 해당한다. 이 값을 기준으로 마치 나무의 가지가 뻗어 나가듯이 데이터가 추가된다. 이진 트리에서는 브랜치가 최대 2개이기 때문에 각 노드는 최..
클로즈 해싱(Close Hashing) 클로즈 해싱은 해시 테이블의 충돌 문제를 해결하는 방법 중 하나로 Linear Probing, Open Addressing 이라고 부르기도 한다. 구조는 간단하다. 위 이미지에서 John Smith와 Sandra Dee의 해시는 똑같이 873이다. 이때 먼저 들어온 John이 873이라는 해시를 먼저 키 값으로 취했고, 다음으로 들어온 Sandra는 바로 다음 값인 874를 키 값으로 가진다. 해시 중복이 발생하면 해당 해시 값부터 순차적으로 빈 공간을 찾기 시작한다. 가장 처음 찾는 빈 공간에 키와 밸류를 저장한다. 저장 효율을 높이는 방법이다. #close hashing class CloseHash: def __init__(self, table_size): se..