Hello

: )

2016년 4월 14일 목요일

알고리즘 문제 풀이 : 자주 쓰이는 코드1

* 초보자를 위한 추천 읽을꺼리 강의 자료에서 모음

1) 입력을 그대로 출력
   char c;  
   while ((c = getchar()) != EOF) {  
     printf("%c", c);  
   }  

2) 1 부터 n 까지 합
 int sumToN(int n) {  
   return n * (n + 1) / 2  
 }  

3) 간편한 최대 공약수 구하기
 int gcd(int a, int b) {  
   int great_common_divisor = 1;  
   for (int k = 1; k <= a && k <= b; ++k) {  
     if (a % k == 0 && b % k == 0) {  
       great_common_divisor = k;  
     }  
   }  
   return great_common_divisor;  
 }  

 int GCD(int a, int b) {  
   while(b != 0) {  
     int r = a % b;  
     a = b;  
     b = r;  
   }  
   return a;  
 }  

 int GCD(int a, int b) {  
   return b == 0 ? a : GCD(b, a % b);  
 }  

4) char 변수 연산
 '0' == 48  
 'A' == 65  
 'a' == 97  
 // 정수 연산 가능  
 '0' + 1 == '1'  
 'A' + 3 == 'D'  
 'G' + 32 == 'g'  
 'p' - 32 == 'P'  

4-1) char <-> int 변환
 int asciiDigitToNumber(char x) {  
   // x >= '0' && x <= '9'  
   return x - '0';  
 }  
 char numberDigitToAscii(int x) {  
   // x >= 0 && x <= 9  
   return x + '0';  
 }  

4-2) 대소문자 변환
 void toCapital(char* s) {  
   for (int i = 0; s[i]; ++i) {  
     if (s[i] &gt;= 'a' &amp;&amp; s[i] &lt;= 'z') {  
       s[i] -= 32;  
     }  
   }  
 }  
 void toLower(char* s) {  
   for (int i = 0; s[i]; ++i) {  
     if (s[i] &gt;= 'A' &amp;&amp; s[i] &lt;= 'Z') {  
       s[i] += 32;  
     }  
   }  
 }  

5) int 의 최대값과 큰 값으로 초기화 필요시
 int a = 2147483647; // maximum value of integer  
 int b =  987654321;  

6) 문자열 세기
 int strlen(char* s) {  
   int len = 0;  
   while (s[len]) {  
     len++;  
   }  
   return len;  
 }  

 int strlen(char *p) {  
   int len = 0;  
   while (*p++ != '\0') {  
     len++;  
   }  
   return len;  
 }  


7) 숫자 하나씩 꺼내쓰기
 while (n > 0) {  
   int k = n % 10;  
   // do something with k  
   ...  
   n /= 10;  
 }  

9) 스택
 const int MAX_STACK_SIZE = 1000;  
 int stack[MAX_STACK_SIZE + 1];  
 int stack_top;  
 void stackInit() {  
   stack_top = 0;  
 }  
 int stackSize() {  
   return stack_top;  
 }  
 bool stackIsEmpty() {  
   return stack_top == 0;  
 }  
 void stackPush(int x) {  
   stack[stack_top++] = x;  
 }  
 int stackPop() {  
   return stack[--stack_top];  
 }  

10) 큐
 const int MAX_QUEUE_SIZE = 10000;  
 int queue[MAX_QUEUE_SIZE + 1];  
 int queue_head;  
 int queue_tail;  
 void queueInit() {  
   queue_head = queue_tail = 0;  
 }  
 int queueSize() {  
   return queue_tail - queue_head;  
 }  
 bool queueIsEmpty() {  
   return queueSize() == 0;  
 }  
 void queuePush(int x) {  
   queue[queue_tail++] = x;  
 }  
 int queuePop() {  
   return queue[queue_head++];  
 }  

11) 반올림
반올림에 대해서 따로 처리할 필요가 없다
.2f 는 소수점 셋째 자리에서 반올림한후 소수점 둘째 자리까지 출력하라는 의미
 printf("%.2f", avg / N);  

12) 덱
 #define MAX 20000  
 int queue[MAX + 1];  
 int front, rear;  
 void init(void) {  
   front = MAX / 2;  
   rear = front + 1;  
 }  
 int size(void) {  
   return rear - front - 1;  
 }  
 void push_front(int n) {  
   queue[front--] = n;  
 }  
 void push_back(int n) {  
   queue[rear++] = n;  
 }  
 bool empty(void) {  
   if (size() > 0)  
     return false;  
   else  
     return true;  
 }  
 int pop_front(void) {  
   if (size() > 0) {  
     return queue[++front];  
   }  
   else {  
     return -1;  
   }  
 }  
 int pop_back(void) {  
   if (size() > 0) {  
     return queue[--rear];  
   }  
   else {  
     return -1;  
   }  
 }  
 int qfront(void) {  
   if (size() > 0) {  
     return queue[front + 1];  
   }  
   else {  
     return -1;  
   }  
 }  
 int qback(void) {  
   if (size() > 0) {  
     return queue[rear - 1];  
   }  
   else {  
     return -1;  
   }  
 }  

댓글 없음:

댓글 쓰기