http://linux-sarang.net/board/?p=read&table=tip&no=5712&page=&o[at]=s&o[sc]=r&o[no]=5711
### 부가 설명 ## split 에서 숫자를 세는 방식 우선 십진수와 형식을 비교해 봅니다.
1자리수에서 2자리수로 넘어가는 형태 0 1 2 3 4 ... 9 10 11 ... aa ab ac ad ae ...
az ba bb ... 여기서 a는 숫자 0, b는 1 ... z는 25가 되고 26가지가 됩니다.
따라서 split에서 세는 방법은 26진수가 됩니다.(어찌 보면 당연한 것을 --;;)
그렇지만 aa는 실제로 0이 아니라 1입니다. 그래서 실제로는 위의 형태가 아래처럼
한자리씩 밀려나는 형태로 바뀝니다.
0 1 2 3 4 ... 9 10 11 ... ? aa ab ac ad ay az aa 1 2 3 4 ... 25 26 27
수식으로 표현하자면 split에서 사용되는 26진법은 십진수로 이런 방식으로 치환됩니다.
yza --> (26^2 * 24) + (26^1 * 25) + (26^0 * 0) + 1 그런데 문제가 있습니다
. .... yx yy yz .. za .. zz 여기까진 문제가 없습니다만..
다음 숫자 baa 가 (이게 맞긴 한걸까 --;;) 만들어진다면...
알파벳 순서로는 숫자의 순서가 뒤바뀌게 됩니다.
그래서 split에서는 좀더 이상한(--;;)형태로 숫자를 셉니다.
aa ab ac ... yz # 십진수로 650(25*26)까지 zaaa zaab zaac ...
zyzz # + 25*26*26 zzaa zzab zzac ... zzyz # + 25*26 zzzaaa
zzzaab zzzaac ... zzzyzz # + 25*26*26 . . .
조금 변경해서 쓰면
/ / / / / aa / aa / ac ... / yz z/aaa z/aab z/aac
... z/yzz zz/ aa zz/ aa zz/ ac
... zz/ yz zzz/aaa zzz/aab zzz/aac ... zzz/yzz
이렇게 일정한 패턴이 계속됩니다. 이제는 알파벳순과 숫자순서가 같게됩니다.
세는 방식이 달라진 만큼 십진수로 바꾸는 방법도 조금 달라집니다.
우선 "/" 앞에 있는 'z'의 갯수에 따라 이전 까지 있던 숫자가 달라지게 되는데..
"/" 앞에 있는 z의 갯수를 zt라고 자연수라고 없으면
: 25*26 * 0 + 25*26*26 * 0 # 0 + 0 = 0 z
: 25*26 * 1 + 25*26*26 * 0 # 1 + 0 = 1 zz
: 25*26 * 1 + 25*26*26 * 1 # 1 + 1 = 2 zzz
: 25*26 * 2 + 25*26*26 * 1 # 2 + 1 = 3 . . . zt
: 25*26 * (zt-(zt/2)) + 25*26*26 * (zt/2) # zt-(zt/2) + zt/2 = zt # zt/2
에서의 나머지는 버립니다. 이렇게 되고 우선 z가 한 개면
zaaa = (25*26*1 + 25*26*26*0) + (26^2*0 + 26^1*0 + 26^0*0 + 1)
zyzz = (25*26*1 + 25*26*26*0) + (26^2*24 + 26^1*25 + 26^0*25 + 1)
이됩니다. 좀 색다른 방식이어서 이것때문에 스크립트가 엄청길어졌습니다.
그렇지만 두자의 숫자로 표현할 수 있는 것이 십진수는 100가지인데 반해
split방식은 650개까지 표현 할 수 있다는데 의미를 두어야할 것 같습니다.