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, 0, 1, 4);
//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년 10월 28일 수요일
[Basic Skill] 순열 만들기
2015년 9월 3일 목요일
[Android] 이미지 대표 색상 추출 하기
안드로이드에서 bitmap의 대표색상을 추출은
안드로이드 support library v7에 포함되어 있는 Palette Class를 통해 가능하다.
정확한 이유는 모르겠지만 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, 0, 1, 4);
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)
이러한 부분집합을 구할때 간단히 비트연산을 이용해서 구할 수 있는 방법이 있다.
이럴경우 각 원소에 대한 모든 부분집합을 구해서 확인해야 한다.
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 |
원소 수에 해당하는 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
i & (1 << j)
- 2n의 값을 갖는다.
- 원소가 n개일 경우의 모든 부분집합의 수를 의미한다.
- Power set(모든 부분 집합)
- 공집합과 자기 자신을 포함한 모든 부분집합
- 각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계산하면 모든 부분집합의 수가 계산된다.
i & (1 << j)
- 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미한다.
2015년 2월 12일 목요일
[Algorithm] Quick Sort
Quick Sort는 보편적으로 가장 빠른 정렬 알고리즘으로 pivot값을 정할때 전체 값중 한쪽에 편중된 pivot이 정해지면 효율이 최악이 될 수도 있어, 경우에 따라서는 Counting Sort가 빠른 경우도 있다.
또한 정렬할 배열이 100개 이하라면 선택 정렬을 사용하는게 속도에 유리할 수가 있다.
또한 정렬할 배열이 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 |
라벨:
진수변환,
함수구현,
Basic skill,
C언어
피드 구독하기:
글 (Atom)