문제에서 키가 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 으로 같은 값으로 취급될 수 있기 때문이다.

+ Recent posts