문제에서 키가 String으로 주어질 경우,
연산이 느리기 때문에 숫자로 변환한다.
* 변환 원리
String -> Usigned long long
12자리 까지는 Ull 타입으로 표현이 가능하다
a ~ z 를 1~26 숫자로 나타낸다.
알파벳은 최대 26이므로, 2진법 5자리수로 나타낸다.
예시)
key : apple
a : 1 = 00001 (2)
p : 16 = 10000 (2)
p : 16 = 10000 (2)
l : 12 = 01100 (2)
e : 5 = 00101 (2)
=> 00001 10000 10000 01100 00101 (2) 로 나타낼 수 있음.
이것을 코드로 구현한다면?
typedef unsigned long long ull;
ull stoull(char key[]) {
ull rtn = 0;
for (int i = 0; key[i]; i++) {
rtn = (rtn << 5) + key[i] - 'a' + 1;
}
return rtn;
}
5자리씩 Shift연산 을 하며 계산한다.
(key[i] - 'a' + 1) 을 하는 이유는 알파벳 a를 0 이 아닌 1로 표현하기 위함이다
왜냐하면 a를 0으로 표현할 경우
a = 0
aa = 0
둘다 0 으로 같은 값으로 취급될 수 있기 때문이다.