From 047363ef3ef6b9f264ffb8dfa476bf314a94c6da Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Fri, 24 Sep 2021 01:14:49 +0900 Subject: [PATCH 01/10] hmin27 stack_queue --- WEEK3/hmin27/stack_queue.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 WEEK3/hmin27/stack_queue.md diff --git a/WEEK3/hmin27/stack_queue.md b/WEEK3/hmin27/stack_queue.md new file mode 100644 index 00000000..d2b4b42a --- /dev/null +++ b/WEEK3/hmin27/stack_queue.md @@ -0,0 +1,36 @@ +Stack and Queue +===== +# Stack +* Data insertion(Push)과 deletion(Pop)은 top에서만 일어남 +* Last In First Out + +## Implementation + 1. Array-Based + - 왼쪽에서 오른쪽으로 요소를 추가 + - top 요소의 index를 계속해서 저장하고 있어야 함 + - Limitation + - stack의 최대 크기(배열의 크기)가 이전에 선언되어야하며 변경할 수 없음 + - 가득 찬 stack에 새로운 요소를 push하려고 하면 예외가 발생함 + 2. Linked List + - Singly linked list 이용 + - top 요소는 리스트의 첫 번째 노드에 저장됨 + +# Queues +* Data Insertion(enqueue or push)는 rear에서 일어나며, Data deletion(dequeue or pop)은 front에서 일어남 +* First In First Out + +## Implementation + 1. Array-Based + - rear의 index를 계속해서 저장하고 있어야 함 + - Pop: queue[0] 삭제 후 모든 요소들을 왼쪽으로 한 칸씩 이동 + - Push: rear index에 저장 + 1-2. Improved Queue + - front와 rear의 index 모두 저장하고 있음 + - Pop: front의 index 증가 + - Push: rear의 index 증가 + - rear이 리스트의 끝에 도달하면 모든 요소들을 왼쪽으로 이동 + 2. Circular Queue + - front와 rear의 index 모두 저장하고 있음 + - front는 첫 요소에서 반시계 방향으로 한 칸 이동한 칸을 가리킴 + - rear는 마지막 요소를 가리킴 + \ No newline at end of file From 3a6928f533f275f35870950ec23738693eeca975 Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sat, 25 Sep 2021 01:27:17 +0900 Subject: [PATCH 02/10] hmin27 boj5086 --- WEEK3/hmin27/boj5086.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 WEEK3/hmin27/boj5086.c diff --git a/WEEK3/hmin27/boj5086.c b/WEEK3/hmin27/boj5086.c new file mode 100644 index 00000000..523ab9de --- /dev/null +++ b/WEEK3/hmin27/boj5086.c @@ -0,0 +1,36 @@ +#include + +int compare(int a, int b) +{ + if (a % b == 0) return 1; + else + { + if (b % a == 0) return 2; + else return 3; + } +} +int main() +{ + int num[2]; + int i = 0, res; + + while (1) { + scanf("%d", &num[i%2]); + if (i % 2 == 1) { + if (num[0] == 0 && num[1] == 0) break; + else + { + res = compare(num[0], num[1]); + } + + switch (res) { + case 1: printf("multiple\n"); break; + case 2: printf("factor\n"); break; + case 3: printf("neither\n"); break; + } + } + + i++; + } + return 0; +} \ No newline at end of file From d5f7394909312908cb6fb1ce8a0a5bfff646c89a Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sat, 25 Sep 2021 01:27:34 +0900 Subject: [PATCH 03/10] hmin boj15953 --- WEEK3/hmin27/boj15953.c | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 WEEK3/hmin27/boj15953.c diff --git a/WEEK3/hmin27/boj15953.c b/WEEK3/hmin27/boj15953.c new file mode 100644 index 00000000..b0121942 --- /dev/null +++ b/WEEK3/hmin27/boj15953.c @@ -0,0 +1,68 @@ +#include +#include +int rankA(int *pz1, int a) { + int i, rankA = 1; + int resA; + + if (a > 21 || a == 0) resA = 0; + else { + for (i = 1; i < 7; i++) { + if (a <= rankA) { + resA = pz1[i - 1]; + break; + } + rankA += i + 1; + } + } + + return resA; +} + +int rankB( int *pz2, int b) { + int i, rankB = 1; + int resB; + int temp = 1; + + if (b > 31 || b == 0) resB = 0; + else { + for (i = 1; i < 6; i++) { + if (b <= rankB) { + resB = pz2[i - 1]; + break; + } + + temp *= 2; + rankB += temp; + } + } + + return resB; +} + +int main() +{ + int *queue; + int prize1[6] = { 500, 300, 200, 50, 30, 10}, + prize2[5] = { 512, 256, 128, 64, 32}; + int front, rear; + int size, i, resA, resB; + + scanf("%d", &size); + + queue = (int *)malloc(sizeof(int) * size * 2); + front = 0; + rear = -1; + + for (i = 0; i < size * 2; i++) { + scanf("%d", &queue[i]); + rear++; + } + + while(front < rear) { + resA = rankA(prize1, queue[front++]); + resB = rankB(prize2, queue[front++]); + printf("%d\n", (resA+resB)*10000); + } + + return 0; +} \ No newline at end of file From e6bc8f42a157b73d4285c7fa94a0752c77dcd3f4 Mon Sep 17 00:00:00 2001 From: Jeong Hyemin <89894326+hmin27@users.noreply.github.com> Date: Sun, 26 Sep 2021 01:01:46 +0900 Subject: [PATCH 04/10] Update README.md --- WEEK1-B/hmin27/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WEEK1-B/hmin27/README.md b/WEEK1-B/hmin27/README.md index cdccfd45..77cdeb21 100644 --- a/WEEK1-B/hmin27/README.md +++ b/WEEK1-B/hmin27/README.md @@ -1,6 +1,6 @@ -#week01 +# week01 -#boj11279 +# boj11279 1. Priority Queue 우선순위 큐 = queue with priority for pop From d0b2e1a1f2ef18b4d1a352833ac5aa21af153277 Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sun, 26 Sep 2021 03:57:03 +0900 Subject: [PATCH 05/10] hmin27 boj2941 --- WEEK3/hmin27/boj2941.c | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 WEEK3/hmin27/boj2941.c diff --git a/WEEK3/hmin27/boj2941.c b/WEEK3/hmin27/boj2941.c new file mode 100644 index 00000000..5ff1b26f --- /dev/null +++ b/WEEK3/hmin27/boj2941.c @@ -0,0 +1,70 @@ +#include +#include + +int main() +{ + char *croAlp[8] = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" }; + char stack[101]; //stack ó $ ߰ + char topElem, nextElem; + char str[10]; + int top = 1; + int temp, cnt = 0, flag = 0; + + stack[0] = '$'; + + while (1) { + + temp = getchar(); + if (temp == '\n') { + --top; + break; + } + else { + stack[top] = temp; + top++; + } + } + + while (1) { + topElem = stack[top--]; + //stack + if (topElem == '$') break; + + //ũξƼ ĺ + else if (topElem == '=' || topElem == '-' || (topElem == 'j' && (stack[top] == 'n' || stack[top] == 'l'))) { + + nextElem = stack[top--]; + sprintf_s(str, sizeof(str), "%c%c", nextElem, topElem); + + for (int i = 0; i < 8; i++) { + if (!strcmp(croAlp[i], str)) { + if (i == 7) { + if (stack[top] == 'd') top--; //dz= z= + } + ++cnt; + ++flag; + break; + } + } + + if (!flag) { + sprintf_s(str, sizeof(str), "%s%c", str, topElem); + + for (int i = 0; i < 8; i++) { + if (!strcmp(croAlp[i], str)) { + ++cnt; + break; + } + } + } + + flag == 0; + + } + //ũξƼ ĺ ƴ ĺ + else cnt++; + } + + + printf("%d", cnt); +} From 659492393ca53e4bb77e8225b730ecefd9605e5f Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Wed, 29 Sep 2021 22:02:48 +0900 Subject: [PATCH 06/10] hmin27 boj11723 --- WEEK3/hmin27/boj11723.c | 171 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 WEEK3/hmin27/boj11723.c diff --git a/WEEK3/hmin27/boj11723.c b/WEEK3/hmin27/boj11723.c new file mode 100644 index 00000000..d4fa8c68 --- /dev/null +++ b/WEEK3/hmin27/boj11723.c @@ -0,0 +1,171 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#define ADD 1 +#define REMOVE 2 +#define CHECK 4 +#define TOGGLE 8 +#define ALL 16 +#define EMPTY 32 + +typedef struct _Elem { + int data; + struct _Elem *next; +} Elem; + +Elem *head; + + +int _check(int val) { // linked list ִ Ȯ 1, 0 return + Elem *ptr; + + if (head != NULL) { + ptr = head; + while (ptr != NULL) { + if (val == ptr->data) return 1; + ptr = ptr->next; + } + + } + + return 0; +} + +void _add(int val) { + Elem *ptr; + ptr = head; + + Elem *newNode = (Elem *)malloc(sizeof(Elem)); + newNode->data = val; + newNode->next = NULL; + + + if (head == NULL) head = newNode; + else { + while (ptr->next != NULL) { + ptr = ptr->next; + } + ptr->next = newNode; + } + +} + +void _remove(int val) { + Elem *curPtr, *prePtr; + + curPtr = head->next; + prePtr = head; + + while (curPtr != NULL) { + if (val == curPtr->data) { + prePtr->next = curPtr->next; + free(curPtr); + break; + } + prePtr = curPtr; + curPtr = curPtr->next; + + } + +// free(prePtr); +} + +int compare(char *opr) { + + if (!strcmp(opr, "add")) return ADD; + else if (!strcmp(opr, "remove")) return REMOVE; + else if (!strcmp(opr, "check")) return CHECK; + else if (!strcmp(opr, "toggle")) return TOGGLE; + else if (!strcmp(opr, "all")) return ALL; + else if (!strcmp(opr, "empty")) return EMPTY; +} + +void operation(int setOpr, int value) { + + if ( (setOpr & CHECK) || (setOpr & ADD) || (setOpr & REMOVE) || (setOpr & TOGGLE) ) { + + if (_check(value)) { + if (setOpr & CHECK) printf("1\n"); + else if(setOpr & REMOVE | setOpr & TOGGLE) { + _remove(value); // ̹ ִٸ ϱ + } + } + else { + if (setOpr & CHECK) printf("0\n"); + else if(setOpr & ADD | setOpr & TOGGLE) { + _add(value); // ٸ ߰ϱ + } + } + } + + else if (setOpr & ALL) { + Elem *tail, *ptr; + int i, lastIndex = 0; + + if (head != NULL) { + ptr = head->next; + for (i = 0; i<20; i++) { + ptr->data = i + 1; + if (ptr->next == NULL) { + lastIndex = i+1; + break; + } + + ptr = ptr->next; + } + + } + + tail = head; + for (i = lastIndex; i < 20; i++) { + Elem * temp = (Elem *)malloc(sizeof(Elem)); + temp->data = i+1; + temp->next = NULL; + + + tail->next = temp; + tail = temp; + } + + tail->next = NULL; + } + + else if (setOpr & EMPTY) { + Elem *curDel, *nextDel; + + if (head != NULL) { + curDel = head; + nextDel = head->next; + + free(curDel); + + while (nextDel != NULL) { + curDel = nextDel; + nextDel = nextDel->next; + free(curDel); + } + + } + + head = NULL; + } +} + + +int main() { + char opr[10]; + int repetition, value, setOpr; + + scanf("%d", &repetition); + + for (int i = 0; i < repetition; i++) { + scanf("%s %d", opr, &value); + setOpr = compare(opr); + + operation(setOpr, value); + } + + return 0; +} \ No newline at end of file From 6421fdc4795622ed90d36108aab8b6af6cbb0baa Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sun, 3 Oct 2021 03:30:45 +0900 Subject: [PATCH 07/10] hmin27 boj10829 --- WEEK4/10829.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 WEEK4/10829.c diff --git a/WEEK4/10829.c b/WEEK4/10829.c new file mode 100644 index 00000000..557463bf --- /dev/null +++ b/WEEK4/10829.c @@ -0,0 +1,25 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +void divideByTwo(long long share) { + long long remainder; + + remainder = share % 2; + share /= 2; + + + if (share == 1) printf("%lld%lld", share, remainder); + else { + divideByTwo(share); + printf("%lld", remainder); + } + +} +int main() { + + long long a; + + scanf("%lld", &a); + divideByTwo(a); + + return 0; +} \ No newline at end of file From 62c0f7bb83ee1248873c5342c35dda6f6131921f Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sun, 3 Oct 2021 03:30:51 +0900 Subject: [PATCH 08/10] Create divde_and_conquer.md --- WEEK4/divde_and_conquer.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 WEEK4/divde_and_conquer.md diff --git a/WEEK4/divde_and_conquer.md b/WEEK4/divde_and_conquer.md new file mode 100644 index 00000000..2ccec20b --- /dev/null +++ b/WEEK4/divde_and_conquer.md @@ -0,0 +1,12 @@ +# Divide ans Conquer 분할정복 +## 분할정복 기법이란? +- 하나의 문제를 여러 subproblems로 나누어 문제를 해결하는 기법 +- 이때 subproblems는 동일한 사이즈이며 재귀적으로 문제 해결 +- parallel computations를 요구하는 문제에서 자주 사용되는 알고리즘 기법 + +## Examples +- Sorting: mergesort, quicksort +- Binary tree traversals +- Multiplication of large integers +- Strassen's matrix multiplication +- Closest-pair and convex-hull problems From 99bd64609f26de9441e5de1666528293457c413c Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Tue, 19 Oct 2021 02:50:31 +0900 Subject: [PATCH 09/10] hmin boj13706 --- WEEK4/13706.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 WEEK4/13706.c diff --git a/WEEK4/13706.c b/WEEK4/13706.c new file mode 100644 index 00000000..4cb9a6c3 --- /dev/null +++ b/WEEK4/13706.c @@ -0,0 +1,23 @@ +#define _CRT_SECURE_NO_WARNINGS +#include + +int sqrt(int start, int end, int n) { + int mid; + mid = (start + end) / 2; + + if ( mid > n / mid) sqrt(start, mid - 1, n); + else if (mid < n / mid) sqrt(mid + 1, end, n); + else return mid; +} + +int main() { + int n; + int res; + + scanf("%d", &n); + + res = sqrt(1, n, n); + printf("%d", res); + +} + From b8a424a33e8225a08645bfcc1558f67306440f98 Mon Sep 17 00:00:00 2001 From: Jeong Hyemin Date: Sun, 14 Nov 2021 02:43:51 +0900 Subject: [PATCH 10/10] hmin27/boj9372 --- WEEK5/boj9372.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ WEEK5/prim.md | 15 +++++++++++ 2 files changed, 81 insertions(+) create mode 100644 WEEK5/boj9372.c create mode 100644 WEEK5/prim.md diff --git a/WEEK5/boj9372.c b/WEEK5/boj9372.c new file mode 100644 index 00000000..90d1ba6b --- /dev/null +++ b/WEEK5/boj9372.c @@ -0,0 +1,66 @@ +#include +#define MAX_COUNTRY 1000 + +void clearmatrix(int graph[][MAX_COUNTRY]) { + for (int i = 0; i < MAX_COUNTRY; i++) { + for (int j = 0; j < MAX_COUNTRY; j++) { + graph[i][j] = 0; + } + } +} + +void makematrix(int graph[][MAX_COUNTRY], int n) { + int a, b; + + for (int i = 0; i < n; i++) { + scanf_s("%d %d", &a, &b); + graph[a + 1][b + 1] = 1; + graph[b + 1][a + 1] = 1; + } +} + +int findpath(int graph[][MAX_COUNTRY], int startP, int preStartP, int n, int cnt) { + int i, total = 0; + if (cnt == n - 1) return cnt; + + for (i = 0; i < n; i++) { + if (graph[startP - 1][i] == 1) { + total++; + } + } + for (i = 0; i < n; i++) { + if (graph[startP - 1][i] == 1) { + if (total == 1) { + findpath(graph, i + 1, startP, n, cnt++); + } + else { + if (startP != preStartP) findpath(graph, i + 1, startP, n, cnt++); + } + } + } + +} + +int main() +{ + int testcase, n, m; + int graph[MAX_COUNTRY][MAX_COUNTRY]; + int i, cnt = 0; + + scanf_s("%d", testcase); + + for (; testcase > 0; testcase--) { + + scanf_s("%d %d", &n, &m); + + clearmatrix(graph); + makematrix(graph, n); + + for (i = 0; i < n; i++) { //ù n α + findpath(graph, i, 0, n, cnt); + } + } + + + return 0; +} \ No newline at end of file diff --git a/WEEK5/prim.md b/WEEK5/prim.md new file mode 100644 index 00000000..efdf352f --- /dev/null +++ b/WEEK5/prim.md @@ -0,0 +1,15 @@ +## Minimum-cost Spanning Trees +* 정의: 최소 신장 트린 동시에 edge에 weight의 비용이 추가된 트리 +* Greedy method: 각각의 단계에서 가장 최적의 해결책을 찾아야 함 +* 예시로는 Kruskal, Prim, Sollin의 알고리즘이 있음 + - constraints: 그래프 내의 edgw를 사용해야 함/ 정확하게 n-1개의 edge들을 사용해야 함/ cycle을 형성하는 edges은 사용하지 않을 수 있음 + +## Prim's Algorithm +모든 노드를 순회해야 할 때 최소의 비용을 택하는 알고리즘 +1. 한 번에 하나의 edge를 선택 + * 이때 선택한 edge는 subtree T에서 이미 선택한 edge들과 연결이 되어있어야 함 + * (u,v) where u in T and v is not in T +2. T에서 egde가 cycle을 만들지 않는 한 계속해서 edge를 선택해서 T에 추가함 +3. T의 edge 개수가 n-1개가 되면 시행 종료 + +이때 시간복잡도는 O(m logn)을 만족함