2015년 10월 28일 수요일

[Basic Skill] 순열 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
 
 
// 배열 출력하기
void printSet(int array[], int size){    
    for (int i = 1; i <= size; i++)
        printf("%d ", array[i]);
    printf("\n");
 
    return;
}
 
// 반복문과 스택을 이용한 순열 구하기
void printPowerset(int n){
    int stack[10], k;
 
    stack[0= 0// 0은 제외
    k = 0;
 
    while (1){
        if (stack[k]<n){
            stack[k + 1= stack[k] + 1;
            k++;
        }
 
        else{
            stack[k - 1]++;
            k--;
        }
 
        if (k == 0)
            break;
 
        printSet(stack, k);
    }
 
    return;
}
 
// 재귀를 통한 순열 구하기
void powersetRec(int s[], int k, int m, int n) {
    if (m <= n) {
        s[k + 1= m;
        printSet(s, k + 1);
        powersetRec(s, k + 1, m + 1, n); /* with m */
        powersetRec(s, k, m + 1, n); /*  without m */
    }
}
 
 
void binaryPowerSet(){
    int i, j;
 
    char arr[4= { 'a''b''c''d' };
 
    int n = 4;
 
 
    for (i = 0; i < (1 << (n)); i++){
 
        for (j = 0; j < n; j++){
 
            if (i & (1 << j)){
 
                //printf("%c ", arr[j]);
                printf("%d ", j+1);
 
            }
 
        }
 
        printf("\n");
 
    }
}
 
int main(){
 
    int s[6]; // stack
    powersetRec(s, 014);
    
    //printPowerset(4);
 
    binaryPowerSet();
 
    return 0;
}
 
void rec(int s[], int k, int m, int n){
    if (m <= n){
        s[k + 1= m;
        printSet(s, k + 1);
        rec(s, k + 1, m + 1, n);
        rec(s, k, m + 1, n);
    }
}
 
 
cs

2015년 9월 3일 목요일

[Android] 이미지 대표 색상 추출 하기

안드로이드에서 bitmap의 대표색상을 추출은
안드로이드 support library v7에 포함되어 있는 Palette Class를 통해 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
int color = 0xFFFFFF// default white
Palette.Builder pb = Palette.from(bitmap);
Palette palette = pb.generate();
if (palette != null && palette.getLightVibrantSwatch() != null) {
    color = palette.getLightVibrantSwatch().getRgb();
}else if (palette != null && palette.getDarkVibrantSwatch() != null) {
    color = palette.getDarkVibrantSwatch().getRgb();
else if (palette != null && palette.getDarkMutedSwatch() != null) {
    color = palette.getDarkMutedSwatch().getRgb();
else if (palette != null && palette.getLightMutedSwatch() != null) {
    color = palette.getLightMutedSwatch().getRgb();
}
Log.e(TAG, "dominantColorFromBitmap = " + Integer.toString(color, 16));
cs

정확한 이유는 모르겠지만 bitmap에서 추출할 수 있는 대표색의 종류가 밝은색, 어두운색 등으로 나뉘지만 모든 색상이 다 추출되지는 않기 때문에 우선순위를 두어 추출하길 권장 한다.


2015년 7월 12일 일요일

수학자 문제 풀이

//
//  main.cpp
//  AlgoTest
//
//  Created by Lonnie Noel on 2015. 7. 12..
//  Copyright (c) 2015 Lonnie Noel. All rights reserved.
//

#include <iostream>

const int N = 8; // pie
const int K = 4; // mathmatic


int currentMathmaticIndex=K-1;


int nCount = 0;
int MaxLast_K = (N-K)+1;
int MaxFirst_K = (N/K);

int Arr[K];


void CheckPieCount(int CurrentIndex)
{
    if(CurrentIndex < 1)
    {
        //printf("[%d]범위에서 벗어났습니다 \n", CurrentIndex);
        return;
    }
    
    int nPieCount = 0;
    for(int i = Arr[CurrentIndex]; i>= MaxFirst_K; i--)
    {
        //printf("for 테스트 : %d \n", i);
        if(Arr[CurrentIndex] < Arr[CurrentIndex-1])
        {
            //printf("%d 최대 갯수는 : %d 입니다 \n", CurrentIndex, i);
            break;
        }
        
        nPieCount = 0;
        printf("CurrentIndex : %d \n", CurrentIndex );
        for(int j= 0; j < K; j++)
        {
            printf("[arr[%d] : %d \n", j, Arr[j]);
            nPieCount += Arr[j];
            
        }
        
        if(nPieCount == N)
        {
            if(Arr[CurrentIndex] != Arr[CurrentIndex-1])
                nCount++;
           
            if(Arr[CurrentIndex]-1 >= Arr[CurrentIndex-1]+1)
            {
                //if((Arr[CurrentIndex]-1) > (Arr[CurrentIndex-1]+1))
                {
                    printf("[CurrentIndex] : %d || [CurrentIndex-1] : %d \n", (Arr[CurrentIndex]-1), (Arr[CurrentIndex-1]+1));
                    //nCount++;
                    Arr[CurrentIndex] --;
                    Arr[CurrentIndex-1] ++;
                }
            }
            else
            {
                break;
            }
            
        }
        
    }
    
    CheckPieCount(CurrentIndex-1);
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    
    
    
    //배열 초기화
    for(int i = 0; i < K; i++)
    {
        if(i == (K-1))
        {
            Arr[i] = MaxLast_K;
        }
        else
        {
            Arr[i] = 1;
        }
    }
    
    CheckPieCount(currentMathmaticIndex);
    
    if(N % K == 0)
    {
        nCount ++;
    }
    
    
    printf("Output : %d \n", nCount);
    
    return 0;
}


2015년 3월 18일 수요일

[Algorithm] stack을 이용한 순열(모든 부분집합, power set) 구하기

Stack을 이용한 순열 구하는 방법으로
아래와 같이 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
 
 
// 배열 출력하기
void printSet(int array[], int size){    
    for (int i = 1; i <= size; i++)
        printf("%d ", array[i]);
    printf("\n");
 
    return;
}
 
// 반복문과 스택을 이용한 순열 구하기
void printPowerset(int n){
    int stack[10], k;
 
    stack[0= 0// 0은 제외
    k = 0;
 
    while (1){
        if (stack[k]<n){
            stack[k + 1= stack[k] + 1;
            k++;
        }
 
        else{
            stack[k - 1]++;
            k--;
        }
 
        if (k == 0)
            break;
 
        printSet(stack, k);
    }
 
    return;
}
 
// 재귀를 통한 순열 구하기
void powersetRec(int s[], int k, int m, int n) {
    if (m <= n) {
        s[k + 1= m;
        printSet(s, k + 1);
        powersetRec(s, k + 1, m + 1, n); /* with m */
        powersetRec(s, k, m + 1, n); /*  without m */
    }
}
 
int main(){
 
    int s[6]; // stack
    powersetRec(s, 014);
    
    printPowerset(4);
 
    return 0;
}
 
cs


출력 결과물

1
1 2
1 2 3
1 2 3 4
1 2 4
1 3
1 3 4
1 4
2
2 3
2 3 4
2 4
3
3 4
4



2015년 3월 17일 화요일

[Algorithm] Binary Counting - 비트연산을 통한 순열(부분집합, power set) 구하기

프로그래밍을 하다보면, 모든 경우의 수를 확인해야 하는 경우가 생기는데,
이럴경우 각 원소에 대한 모든 부분집합을 구해서 확인해야 한다.

1, 2, 3에 대해서 본다면 아래와 같은 모든 부분 집합이 존재 한다.
(1), (2), (3), (1 2), (1 3), (2 3), (1 2 3)

이러한 부분집합을 구할때 간단히 비트연산을 이용해서 구할 수 있는 방법이 있다.


A, B, C, D에 대한 부분 집합 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(void){
    int i, j;
    char arr[4= { 'a''b''c''d' };
    int n = 4;
    for (i = 0; i < (1 << (n)); i++){
        for (j = 0; j < n; j++){
            if (i & (1 << j)){
                printf("%c ", arr[j]);
            }
        }
        printf("\n");
    }
}
cs
위 비트연산 1<<(n) 과, i & (1<<j) 에 대한 설명은 ->여기로<-

원소 수에 해당하는 N개의 비트열을 이용한다.
N번째 비트값이 1이면 N번째 원소가 포함되었음을 의미한다.


4비트에서 하나씩 증가 했을때의 자리수로 아래와 같이 출력됨.

10 진수
이진수
{A, B, C, D}
0
0000
1
0001
A
2
0010
B
3
0011
B, A
4
0100
C
5
0101
C, A
6
0110
C, B
7
0111
C, B, A
8
1000
D
9
1001
D, A
10
1010
D, B
11
1011
D, B, A
12
1100
D, C
13
1101
D, C, A
14
1110
D, C, B
15
1111
D, C, B, A



[Basic Skill] 유용한 비트 연산자

1<<n
  • 2n의 값을 갖는다.
  • 원소가 n개일 경우의 모든 부분집합의 수를 의미한다.
  • Power set(모든 부분 집합)
    • 공집합과 자기 자신을 포함한 모든 부분집합
    • 각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계산하면 모든 부분집합의 수가 계산된다.

i & (1 << j)
  • 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미한다.

2015년 2월 12일 목요일

[Algorithm] Quick Sort

Quick Sort는 보편적으로 가장 빠른 정렬 알고리즘으로 pivot값을 정할때 전체 값중 한쪽에 편중된 pivot이 정해지면 효율이 최악이 될 수도 있어, 경우에 따라서는 Counting Sort가 빠른 경우도 있다.

또한 정렬할 배열이 100개 이하라면 선택 정렬을 사용하는게 속도에 유리할 수가 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void quicksort(int arr[], int left, int right){
    int i = left, j = right;
    int tmp;
    int pivot = arr[(left + right) / 2];
    while (i <= j){
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j){
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    if (left < j)
        quicksort(arr, left, j);
    if (i < right)
        quicksort(arr, i, right);
}
cs

[Basic Skill] 2,4,8,16진수 -> 10진수 변환하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 제곱근
int power(int value, int num){
    int result = 1;
    for (int i = 0; i < num; i++)
        result *= value;
    return result;
}
// 진수변환하기 (2,4,8,16 진수를 10진수로 변환)
// input ex) B, Q, O, H  (순서대로, 2, 4, 8, 16진수)
// 2진수 양수 )  1.0.1.1.B  or  +1.1.0.B
// 4진수 음수 )  -3.0.1.1.Q
// 16진수 음수 )  -A.9.F.H
int converToDec(char * str, int length, int type){
    int count = 0;
    // 해당 진수의 재곱근하여 자리수를 찾음.
    count = power(type, (length + 1/ 2 -1);
    int result = 0;
    char tempStr[50= { 0, };
    int start = 0;
    int end = 0;
    bool minus = false;
    int atoi = 0;
    
    for (int i = 0; i <= length; i++){
        if (*(str + i) == '.'){
            end = i;
            stringCopy(tempStr, str, start, end);
            atoi = asciiToInteger(tempStr);
            result += atoi * count;
            start = end + 1;
            count /= type;            
        }
        else if (*(str + i) == '-'){ // 음수일경우
            start = i + 1;
            minus = true;
        }
        else if (*(str + i) == '+'){ // 양수일경우
            start = i + 1;
        }
    }
    if (minus)
        return -result;
    return result;
}
cs