HackerRank 49

[HackerRank C] Implementation : Sales by Match

양말의 짝이 몇개가 있는지 세는 문제다. n개의 숫자가 입력된 배열에서 같은 숫자가 2개씩 얼만큼 짝이 되는지 세면 된다. 코드 간편한 방법을 사용하긴 했지만 메모리 소모가 큰 편이다. (양말 종류가 적을 경우) n의 범위가 1부터 100이었기 때문에 사용가능한 방법이었다. int sockMerchant(int n, int ar_count, int* ar) { int a[101] = {0}; int i, ck=0; for(i=0; i

[HackerRank C] Warmup : Plus Minus

조건 배열 안에서 1. 양수의 비율, 2. 음수의 비율, 3. 0의 비율을 각각 출력하면 된다. 코드 void plusMinus(int arr_count, int* arr) { int p=0, m=0, z=0, i; for(i=0; i0) p++; else if(arr[i]==0) z++; else m++; } printf("%lf\n%lf\n%lf", (double)p/arr_count, (double)m/arr_count, (double)z/arr_count); } 먼저 양수, 음수, 0의 개수를 저장할 p, m, z 변수를 각각 선언했다. if문으로 조건에 따라 개수를 나눈 뒤, 자료형에 주의해 출력하면 된다. 변수를 int형을 선언했으나 소수점 출력이 가능해야 하므로, cast연산자로 비율을 계산..

[HackerRank C] Implementation : Subarray Division

s 배열에서 연속으로 m개만큼 더해 그 합이 d가 되는 개수를 찾으면 된다. n s[i] d m 처음엔 상당히 복잡하게 생각했는데 생각보다 쉬운 문제였다. 고민한 것이 무색하게도... d=1이나 m=1같은 케이스를 따로 만들어줬었는데 오히려 더 복잡해져서 빼버렸다. 그리고 합을 저장할 배열을 따로 선언할 필요 없이 바로 answer을 flag처럼 이용해 개수를 구했다. int birthday(int s_count, int* s, int d, int m) { int i, j, answer = 0, temp; for(i=0; i

[HackerRank C] Warmup : Mini-Max Sum

5개의 정수 중 각 숫자를 제외한 합 중에 가장 작은 값과 큰 값을 출력하면 되는 문제다. ※ 자료형 주의 : 합은 int 범위를 넘어갈 수 있음. 처음에 생각했던 방법은 두 가지다. 먼저 5개를 다 합한 sum에서 배열의 첫번째 인덱스부터 마지막 인덱스까지 뺀 값을 s_arr배열에 저장해 합을 구해놓고, 1. s_arr배열을 크기순으로 정렬해 첫번째 값과 마지막 값을 출력 2. s_arr배열에서 min값과 max값만 따로 구함. 혹은 아예 s_arr에 저장할 때 크기순으로 비교하면서 저장해 큰 값은 뒤로 미는 방식도 생각했는데 너무 복잡할 것 같아 2번을 선택했다. void miniMaxSum(int arr_count, int* arr) { int i, j; double s_arr[5] = {0}, s..

[HackerRank C] Implementation : Grading Students

점수를 매기는 방법 40점 미만은 낙제다. 38점이상부터 반올림을 한다. 점수보다 높은 5의 배수와 3점 미만의 차이가 나면 반올림을 한다. 반올림 예) 38 -> 40, 58 -> 60 반올림 안하는 경우 : 55, 56, 77 코드 int* gradingStudents(int grades_count, int* grades, int* result_count) { int *a = malloc(grades_count*sizeof(int)); *result_count = grades_count; int i; for(i=0; i=38){ if((a[i]/5+1)*5-a[i]= 이어야되는데 착각했었다;; int* gradingStudents(int grades_count, int* grades, int* res..

[HackerRank C] Tree : Inorder Traversal

중위순회(Inorder) left -> root -> right 왼쪽자식노드 -> 부모노드 -> 오른쪽 자식노드순으로 방문한다. void inOrder( struct node *root) { if(root->left) inOrder(root->left); if(root) printf("%d ", root->data); if(root->right) inOrder(root->right); } 노드가 null이 아닌 것에 주의한다. left 노드를 먼저 방문하고 root 일 때 data를 출력한다. 마지막으로 right 노드를 방문한다. 재귀적으로 함수를 사용해 해결해주었다.

[HackerRank C] Tree : Postorder Traversal

이번엔 Postorder, 후위순회 문제이다. 후위순회 순서는 다음과 같다. 왼쪽 자식 노드 -> 오른쪽 자식 노드 -> 부모노드 [left -> right -> root] void postOrder( struct node *root) { if(root->left) postOrder(root->left); if(root->right) postOrder(root->right); if(root) printf("%d ", root->data); } 노드가 null이 되지 않게 주의한다. (if문으로 처리) 첫번째로 left노드, 두번째로 right노드를 돈다. 마지막으로 root를 도는데 이 때 data를 출력해준다.