공룡호가 사는 세상 이야기

UVA - 10018
programming-challenges - 110502


Reverse And Add는 어떤수를 입력 받았을 때 이것을 뒤집어서 원래의 수에 더하는 과정이다.
이 과정을 반복하다가 결과가 Palindrome(앞뒤 어느쪽으로 보아도 같은 말이 되는 어구 ex : eye ,madam)이 될 때까지 반복한다.

이 Palindrome을 찾기까지의 Reverse and Add 횟수와 찾아진 Palindrome을 출력하는 프로그램을 만들어 보자.

195 + 591 = 786
786 + 687 = 1473
1473 + 3743 = 5214
5214 + 4125 = 9339

입력
그 아래부터 테스트 하려는 정수 N

출력
주어진 N에 대한 Reverse and Add횟수와 찾아진 Palindrome을 공백을 두고 출력한다.

입력 예제
195
265
750

출력 예제
4 9339
5 45254
3 6666

Explanation :
숫자를 뒤집어서 비교하면서 더해주기만 하면 되는 문제이다.
숫자를 뒤집는 방법은 여러가지가 있다. string으로 변환하여 뒤집어서 비교하는 방법, 수학적 연산으로 수를 뒤집는 방법 등이 있다.
2가지 방법으로 해결한 소스는 아래에 첨부.

1st - 숫자뒤집기

#include <stdio.h>

int process(int n)
{
int result = 0;

while(n) //입력수가 0이 아닌동안
{
result = (result * 10) + (n % 10); //결과를 10배하고 단위값 추가
n /= 10; //입력수 단위를 밀어낸다
}

return result;
}

void main(void)
{
int n, rev;
int cnt = 0;
scanf("%d", &n);

while(1)
{
rev = process(n); //뒤집기

if (n == rev) //팰린드롬 유/무 판단
{
printf("%d ", cnt);
printf("%d\n", n);
break;
}
n = n + rev; //뒤집은 값 더하기
cnt++; //reverse and add 횟수 증가
}
}


2st - 뒤집지 않고 검사 (By Won.suck)

#include <windows.h>
#include <stdio.h>
#include <sys/timeb.h>

bool isCondition( char *pNum, int length )
{
for( int i=0; i<length/2; ++i )
if( pNum[i] != pNum[length-i-1] )
return FALSE;
return TRUE;
}

void func( int input )
{
printf( "func %d\n", input );

char temp[32];
int length;
itoa( input, temp, 10 );
length = strlen( temp );

if( isCondition( temp, length ) )
printf( "Result : %s\n", temp );
else
{
int newNum = 0;
for( int i=0; i<length; ++i )
newNum = newNum*10 + (temp[i]-'0' + temp[length-i-1]-'0');
func( newNum );
}
}

void main()
{
func(195);
}

'프로그래밍' 카테고리의 다른 글

strcmp() 함수  (0) 2006.01.19
칼로리 계산(Back Tracking)  (2) 2006.01.18
ACM 10127 ONES  (0) 2006.01.16
GetTickCount() Function  (1) 2006.01.16
chaos in FOR loop  (0) 2006.01.13

ACM 10127 ONES

프로그래밍2006. 1. 16. 14:53
2나 5로 나눌 수 없는 0이상 10,000 이하의 정수 n이 주어졌는데, n의 배수 중에는 10진수로 표기할시 모든 자리 숫자가 1인 것이 있다. 그러한 n의 배수 중에서 가장 작은 것은 몇자리 수인가?

입력
한줄에 하나의 정수가 입력된다.

출력
(자세한 설명은 생략한다?) n이 1로만 이루어진 숫자의 약수일 경우 1로만 이루어진 숫자의 자릿수를 출력한다? 중복일때는 최소값을 출력한다?

입력 예제
3
7

출력 예제
3
6

입력받은 숫자와 모든 자리가 '1'인 숫자와 계속 비교

#include <stdio.h>

int process(unsigned int n)
{
unsigned long cnt = 11;
int count = 2;

if (n == 1)
return 1;

while(1)
{
if (cnt % n == 0)
return count;

cnt = cnt * 10 + 1; //모든 자리의 값이 '1'
count++; //자릿수
}
return 0;
}

void main(void)
{
unsigned int n;
scanf("%d", &n);

printf("%d\n", process(n));
}

'프로그래밍' 카테고리의 다른 글

칼로리 계산(Back Tracking)  (2) 2006.01.18
ACM 10018 Reverse And Add  (0) 2006.01.16
GetTickCount() Function  (1) 2006.01.16
chaos in FOR loop  (0) 2006.01.13
ACM 10110 Light, More Light  (0) 2006.01.13

어떤 명령어의 수행시간을 측정하고 싶을때가 있다.
이때 유용하게 사용할수 있는 함수가 GetTickCount()이다.

GetTickCount()함수는 시스템이 시작 된 후 얼마의 시간이 경과했는지를 반환한다. 단위는 밀리세컨드 단위이다. 참고로 경과시간은 DWORD(32비트 값)이므로 최대 49.7일이 지나면 다시 0으로 된다고 한다.

The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.

DWORD GetTickCount(void);

Parameters : This function has no parameters.
Return values : The return value is the number of milliseconds that have elapsed since the system was started.


#include <iostream>
#include <windows.h> //GetTickCount()함수 이용을 위해 추가한다.

using namespace std;

void main()
{
long startTime = GetTickCount(); //현재 시각을 저장한다.(시작지점)

for(int i=0; i<100000; i++) //시간 딜레이를 주기 위해 i값을 출력한다.
cout<<i<<endl;; //여기서는 테스트 하기 위한 명령어라고 보면 된다.

long endTime = GetTickCount(); //현재 시각을 저장한다.(종료지점)
long tickDiff = endTime - startTime; //수행시간 = 종료시각 - 시작시각
long secDiff = tickDiff / 1000 ; //이건 초단위로도 나타내기 위한 것.

cout<<"Start Time : "<<startTime<<"ms"<<endl; //시작시각
cout<<"End Time : "<<endTime<<"ms"<<endl; //종료시각
cout<<"Tick difference : "<<tickDiff<<"ms"<<endl; //밀리세컨드 단위
cout<<"Second difference : "<<secDiff<<"s"<<endl; //초단위
}

'프로그래밍' 카테고리의 다른 글

ACM 10018 Reverse And Add  (0) 2006.01.16
ACM 10127 ONES  (0) 2006.01.16
chaos in FOR loop  (0) 2006.01.13
ACM 10110 Light, More Light  (0) 2006.01.13
ACM 100 3n+1 Problem  (2) 2006.01.10

새해를 맞은지도 어느덧 보름이 다 되어간다. 오늘은 오랫만에 도 내리고 있다.
게다가 13일의 금요일이라니...
휴대폰 사진을 정리하다 이녀석 사진이 나왔다.
작년이라는 단어를 써서 일부러 날짜와 거리를 두고 싶은 마음은 없지만, 그래도 작년은 작년이다. 내가 가지고 있는 수많은 인연들. 그중에 하나.
아끼는 친구들 중에 하나.

오랫만에 만났다.
예전엔 여자를 만나는 것이 남자를 만나는 것 보다 더 좋았는데, 이제는 완전히 뒤집어져 버렸다.
철이든 걸까 아니면...(?)
경상도 말로, '우리 친구아이가!' 라고 말하는 것은 과연 어떤 의미일까. 아마 어떤 경우에든 긍정적인 의미로 자동 변화되지 않을까?
친구한테 미안한 일이 생겼는데, 서울말로 '우리 친구지 않니?' 라고 말하면 한대 때리고 싶을 것 같다.
어쨌든, 이녀석에 대한 페이지를 만들어 두는것이 어떨까 하는 생각이 들었다. 말이 더 필요하나. 친구? ㅋㅋ

'일상다반사' 카테고리의 다른 글

진정한 로또는 바로 이것.  (0) 2006.01.22
Another kind of the meaning.  (0) 2006.01.20
Adieu 2005, Welcome 2006  (1) 2006.01.01
마징가제트  (0) 2005.11.05
종소리  (0) 2005.07.22

for (expr1; expr2; expr3)
statement;
next statement;

굉장히 많이 쓰는 루프문이라서, 전부 알고 있다고 생각했는데 그것이 아니었다. expr1의 값으로 for루프를 최소 한번은 실행한다고 생각했는데, 그것이 아니었다.
내가 알고 있던 것은 expr1로 statement를 실행한 다음 expr3 을 수행하고, expr2 수식을 평가하여 참이면 다시 루프를 수행하는 것이었는데, 시간이 지나면서 착각을 일으킨 것일까.
expr1이 expr2의 조건을 만족하지 않는다면, 단 한번도 실행되지 않는다.

여기서 expr2를 사용하고 for루프의 몸체에 continue 문장이 없다면, 이것은 다음과 완전히 동일하다.

expr1;
while (expr2) {
statement;
expr3;
}
next statement;

보라, expr1은 먼저 expr2를 평가하고, 만족하지 않으면 next statement로 바로 이동하는 것을 볼 수가 있다.

어렵지 않게 찾아낼 수 있던 것이었지만, 반복루프와 함수 안에 갖혀서 찾아낼 수가 없었다.... 덕분에 하루종일 삽질했다. -_-
기본적인, 함수와 키워드의 사용에 익숙해 지다 보면, 내가 사용하는 방법이 전부이며 그것이 반드시 맞을 것이라는 착각에 빠지게 된다.
에러를 찾을 수 없을 때, 프로그래머는 첫줄부터 다시 읽어 나가지만 자신의 착각속에서 이루어지는 디버그는 의미가 없다.

'프로그래밍' 카테고리의 다른 글

ACM 10127 ONES  (0) 2006.01.16
GetTickCount() Function  (1) 2006.01.16
ACM 10110 Light, More Light  (0) 2006.01.13
ACM 100 3n+1 Problem  (2) 2006.01.10
오각수 구하기  (0) 2006.01.10

ACM - 10110
Programming Challenges - 110701


우리 학교의 어떤 복도는 전구마다 불을 켜고 끄는 스위치가 있다. 불이 꺼져 있을때 스위치를 누르면 불이 켜지고 다시 스위치를 누르면 불이 꺼진다. 처음에는 모든 전구가 꺼져 있다.

복도에 n개의 전구가 있을 때, 복도를 n번 왕복하면서 i 번째 갈 때 i 로 나누어 떨어지는 숫자의 위치에 있는 스위치를 누르고 돌아올 때는 누르지 않는다.

이런 식으로 스위치를 누를 때 n개의 전구가 있을 때 n번 왕복하며 스위치를 누를 때 가장 마지막 전구의 상태를 출력하는 프로그램을 작성하자.

입력
전구의 수를 나타내는 정수 (2^32 - 1 이하) 를 입력하고, 출력한다.

출력
전구가 켜져 있으면 "Y"를 꺼져 있다면 "N"를 출력한다.

입력 예제
3
6241
8191

출력 예제
N
Y
N

손쉽게 아래 알고리즘을 설계할 수 있다.
어차피 마지막 전구의 상태만 출력할 수 있으면 되므로, 다른 전구가 켜지든 말든 상관하지 않아도 된다.
따라서 1부터 N까지의 정수로 N을 하나씩 나누어 보면서
나누어 떨어지는 숫자가 나올 때 마다 bool값의 스위치값을 반대로 설정해 주고, 끝나면 스위치 값을 화면에 뿌려주면 된다...
하지만 속도를 개선해야 한다면? 일단 다음 소스를 보자...

#include <stdio.h>

char switch_light(int n)
{
bool onoff = false; //초기 전구값

for (int i=1; i<=n; i++)
{
if (n % i == 0) //마지막 전구만 알아내면 된다.
{//꺼져있으면 켜고, 켜져있으면 끈다.
if (onoff == false)
onoff = true;
else
onoff = false;
}
}

if (onoff == true) //마지막 전구값 리턴
return 'Y';
else
return 'N';
}


void main(void)
{
int n;
scanf("%d", &n);

printf("%c\n", switch_light(n));
}

사람이 생각하는 방식과 똑같이 구현된 알고리즘이다.
한번씩 지나가면서 마지막 전구만 켜고 끄게 설계되어 있다.
그렇지만 결과도출에 시간제한을 걸어 버린다면, for문으로 해결할 수 없게된다.

그럼 처음으로 돌아가서 문제를 다시 확인 해 보자.
N을 켜고 끄려면 N만큼 i의 회수를 증가하면서 켜고 끄는동작을 반복한다. 즉 1 <= i <= N 이라는 결과가 성립하게 되는데.
나누어서 떨어지는 숫자라는 것은. 약수를 말한다. 다른 모든 약수를 제외하면 그 어떤 정수이건 간에 1과 자기 자신은 약수로 가지게 된다.
그렇다면 첫번째 지나갈때와 N번째 지나갈때는 무조건 한번씩 켜고, 끄게 되므로 최종적으로는 꺼져 있게 된다. 결국 변화가 없다는 이야기다.

문제를 조금 더 좁혀 보면, 1과 자기자신을 제외하고 약수가 없다면(정수의 범위 내에서) 이 전구는 결국 꺼져 있게 된다.
그럼 약수를 구해야 할까? 아니다. 조금 더 문제를 좁혀 보자.

9의 제곱근은 -3과 3이다. 즉 -3과 3을 제곱하면 9가 된다는 소리다.
여기서 1과 N사이의 범위에 포함되는 것은 3 하나 뿐이다.
9의 약수는 (1, 3, 9) 3개가 존재한다. 좀 전에 말했듯이 1과 자기자신을 제외하면 3이 남는다.
이것이 무슨말인고 하니, 정수의 제곱근을 가지는 정수 N의 약수는 홀수라는 소리다. 즉 불이 켜진다.
정수를 제곱근으로 가지지 않는 N을 하나 예를 들어보자.
약수를 순서대로 나열하면, 제곱근을 가운데로 두고 양쪽에 짝수개의 약수가 배열된다.
정리를 하자면, 양수의 정수를 제곱근으로 가지는 정수 N이 있다면, N의 약수는 홀수개 이다.
11, 8, 13 과 같이 정수를 제곱근으로 가지지 않는 정수는 1과 자기자신을 제외한 약수가 없거나, 있다해도 제곱근이 없으므로 짝수가 된다. 즉 불이 꺼진다.

즉, N을 입력받아 양의 제곱근이 있는지 판단하여, 있다면 전구가 켜져있는 것이고, 아니라면 꺼진 것이다.

#include <stdio.h>
#include <math.h>

int main()
{
long unsigned double cN=0, cTrue = 0;

while (1)
{
scanf("%Lf",&cN);

if ( cN == 0 )
return 0;

cTrue = sqrt(cN); //제곱근 구하기

if ( cTrue * cTrue != cN ) //다시 제곱하여 그 숫자와 일치하는지
printf("N\n");
else
printf("Y\n");
}
}

'프로그래밍' 카테고리의 다른 글

GetTickCount() Function  (1) 2006.01.16
chaos in FOR loop  (0) 2006.01.13
ACM 100 3n+1 Problem  (2) 2006.01.10
오각수 구하기  (0) 2006.01.10
Merge Sorting Algorithm.  (0) 2006.01.10

The Original : http://acm.uva.es/p/v1/100.html
UVA no : 100

영어로 되어있어서 어려운 건줄 알았더니..OTL.. 어쨌든 Accepted!!

>>Background
Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.

>>The Problem
Given the input 22, the following sequence of numbers will be printed
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)
Given an input n, it is possible to determine the number of numbers printed (including the 1). For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.
For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.

>>The Input
The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.
You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.
You can assume that no opperation overflows a 32-bit integer.

>>The Output
For each pair of input integers i and j you should output i, j, and the maximum cycle length for integers between and including i and j. These three numbers should be separated by at least one space with all three numbers on one line and with one line of output for each line of input. The integers i and j must appear in the output in the same order in which they appeared in the input and should be followed by the maximum cycle length (on the same line).

>>Sample Input
1 10
100 200
201 210
900 1000

>>Sample Output
1 10 20
100 200 125
201 210 89
900 1000



#include <stdio.h>
#include <stdlib.h>

int solve(int first, int last)
{
int cnt, i = 0;
int max = 1;

for (first; first <= last; first++)
{
i = first;
while (i != 1)
{
if (i % 2 == 0) //even number
{
i = i / 2;
cnt++;
}

else //odd number
{
i = i * 3 + 1;
cnt++;
}
}
if (cnt > max) //MAX Update
max = cnt;
cnt = 0; //cnt Initialize
}
return max;
}

void main(void)
{
int i, j;
scanf("%d %d", &i, &j);

if(i < 1 || i > 10000000 || j < 1 || j > 10000000)
exit(1); //Error Check

int max = solve(i, j); //call solve function

printf("\n%d %d %d\n\n", i, j, max);
}

'프로그래밍' 카테고리의 다른 글

chaos in FOR loop  (0) 2006.01.13
ACM 10110 Light, More Light  (0) 2006.01.13
오각수 구하기  (0) 2006.01.10
Merge Sorting Algorithm.  (0) 2006.01.10
Distribution Counting(분포수 세기)  (0) 2006.01.09

다각형의 모양으로 배열되는 점의 수를 삼각수, 사각수, 오각수라 한다. 입력받은 숫자가 오각수 인지 여부를 판별하는 프로그램을 작성하시오.

삼각수
N개의 점을 연결하여, 삼각형을 만들 수 있다면, N은 삼각수라 한다.
  ㅇ
N=3, 3은 삼각수이다. 3보다 큰 최소의 삼각수는 6이다.

사각수
N개의 점을 연결하여, 사각형을 만들 수 있다면, N은 사각수라 한다.
ㅇ ㅇ
ㅇ ㅇ N=4, 4는 사각수이다. 4보다 큰 최소의 사각수는 9이다.

오각수
N개의 점을 연결하여, 오각형을 만들 수 있다면, N은 오각수라 한다.
N=5, 12, N은 오각수이다.

입력받은 숫자가 오각수인지 아닌지를 판별하는 프로그램을 작성하시오.

#include <stdio.h>

char distinction(int n)
{
int pentagon, mid_n = 0;

for(int i = 2; i < n; i++)
{
for(int j = 1; j < i; j++)
mid_n += j;

pentagon = (i * i) + mid_n; //make pentagon series.

if(n == pentagon) //comparison.
return 'Y';

pentagon, mid_n = 0; //ReInitialize
}
return 'N'; //not find
}

void main(void)
{
int n;
scanf("%d", &n);

char result = distinction(n);

printf("\n%d %c\n\n", n, result);
}

'프로그래밍' 카테고리의 다른 글

ACM 10110 Light, More Light  (0) 2006.01.13
ACM 100 3n+1 Problem  (2) 2006.01.10
Merge Sorting Algorithm.  (0) 2006.01.10
Distribution Counting(분포수 세기)  (0) 2006.01.09
Shell Sort Algorithm.  (0) 2006.01.09

1. 병합정렬은 이미 정렬된 두 파일을 병합(Merge)하는 과정을 일반화한 것이다. 또한 자료 배열에 접근하는 방법이 순차적(Sequential)이다. 다른 정렬 방법이 뚝 떨어진 배열 요소를 비교하고 교환하는데 비하여 병합정렬은 배열을 차례로 읽으면서 비교하는 방법이다.
그래서 병합정렬은 연결 리스트와 같은 순차적 접근만이 가능한 자료 구조에 유일한 정렬방법이 된다.

2. 두 개의 배열에서 꺼내어지는 최소의 값들을 비교하여 작은 쪽의 값을 선택하는 방법으로 이루어진다. 또한 병합에서는 반드시 한 쪽이 먼저 소진되는 경우가 발생하므로 이에 대한 대비도 있어야 한다.

void merge_sort(int a[], int n)
{
int i, j, k, first, second, size;
int *b;

b = new int[n]; //병합 장소

for (size = 1; size < n; size++)
{
first = -2 * size; //first와 second의 초기값
second = first + size;

while (second + size * 2 < n) //다음 second값이 n보다 작으면
{
first = second + size;
second = first + size;

i = first;
j = second;
k = first;

while (i < first + size || (j < second + size && j < n))
{ //병합이 완료되지 않았다면
if (a[i] <= a[j])
{
if (i < first+size)
b[k++] = a[i++];
else
b[k++] = a[j++];
}
else
{
if (j < second + size && j < n)
b[k++] = a[j++];
else
b[k++] = a[i++];
}
}
}
for (i = 0; i < n; i++)
a[i] = b[i];
}
delete b;
}

3. 병합정렬의 루프와 쉘 정렬의 루프는 상당히 비슷하다. 쉘 정렬h를 점점 감소시킴에 반해병합정렬단위의 크기를 증가시켜야 하는 점이 다르지만 루프의 조건이 상당히 비슷하다.

4. 소스를 보면 알겠지만, 루프문의 중복 사용으로 size를 하나씩 증가시키는데, size만큼 블럭을 이동해야 하므로 '*'연산을 하여 1,2,4,8,16... 순서로 블럭을 이동한다., 이전 블럭은 이미 정렬이 이루어진 상태이므로 각 블럭의 최초값부터 하나씩 비교하면서 작은 값을 선택하여 새로운 배열에 삽입한다.
중요한 점은, 1 5 8 11 이라는 A배열13 15 18 19 라는 B배열이 있다고 가정했을때, A배열의 모든 원소는 B배열의 첫번째 원소인 13보다 작다. 그러므로 A배열의 모든 원소가 소진될 때 까지 B배열의 값은 하나도 선택되지 않는다. 그러므로 루프문 내의 조건에서 둘 중 하나의 원소가 바닥났을 때의 경우를 생각하여, 비교할 원소가 없을 때에는 남은 원소를 차례로 선택하도록 해 주는 작업이 필요하다.

'프로그래밍' 카테고리의 다른 글

ACM 100 3n+1 Problem  (2) 2006.01.10
오각수 구하기  (0) 2006.01.10
Distribution Counting(분포수 세기)  (0) 2006.01.09
Shell Sort Algorithm.  (0) 2006.01.09
Indirect Insert Sorting Algorithm  (0) 2006.01.09

1. 같은 키가 많이 있는 배열에 한해 적용할 수 있는 정렬 알고리즘.
1. 특정 키값이 출현하는 빈도를 저장하여 누적분포를 이용하여 간단하게 정렬하는 방법.

2. 다음과 같이 키값이 1에서 5까지만의 정수값을 가지는 a[]배열.
1 3 2 2 3 1 3 2 4 2 4 3 1 2 1 2 5 1 5 3

우선 count[]라는 배열에 각 숫자별로 몇번이나 출현하였는지 카운트 하여 저장한다.
count[1] = 5
count[2] = 6
count[3] = 5
count[4] = 2
count[5] = 2

3. 이 다음의 과정은 count[] 배열의 누적돗수를 구하는 것이다.
count[1] = 5
count[2] = count[2] + count[1] = 11
count[3] = count[3] + count[2] = 16
count[4] = count[4] + count[3] = 18
count[5] = count[5] + count[4] = 20

누적돗수의 의미는 정렬이 완료된 상태에서 1이라는 키는 0에서 4까지 차지하며, 2라는 키는 5부터 10까지, 3이라는 키는 11부터 15까지, 4라는 키는 16부터 17까지, 5라는 키는 18부터 19까지 차지한다는 것. 즉, count[i]는 i라는 키가 위치할 곳을 가리키고 있는 것.

void dist_count(int a[], int n, int m)
{
int i;
int *b, *count;

b = new int[];
count = new int[];

for(i = 0; i <= m; i++) //count배열 초기화
count[i] = 0;

for(i = 0; i < n; i++) //빈도수 계산
count[a[i]]++;

for(i = 2; i <=m; i++) //누적 분포 계산
count[i] = count[i - 1] + count[i];

for(i = n - 1; i >= 0; i--) //뒤에서부터 읽어 b에 저장
b[--count[a[i]]] = a[i];

for(i = 0; i < n; i++) //b에서 a로 복제
a[i] = b[i];

delete b; //메모리에서 해제
delete count;
}

4. 분포수세기는 한정된 용도에서만 적합하다. 약 N번의 비교와 1번의 전체복사가 있는 정도여서 속도가 빠른 편이지만 키 값의 분포를 저장하는 count배열과 작업결과를 임시로 저장할 b배열을 생성해야 하므로 메모리의 소모가 크다. 배열의 크기가 커지면 그만큼 N이 커지므로 메모리는 더 많이 필요하게 된다.

※ 분포수세기 알고리즘은 기수 정렬 알고리즘의 기초가 된다

'프로그래밍' 카테고리의 다른 글

오각수 구하기  (0) 2006.01.10
Merge Sorting Algorithm.  (0) 2006.01.10
Shell Sort Algorithm.  (0) 2006.01.09
Indirect Insert Sorting Algorithm  (0) 2006.01.09
Insertion Sorting Algorithm.  (0) 2006.01.09