소소한팁 - 문자열을 숫자로 변환하기
16 Feb 2020 | 알고리즘 소소한팁알고리즘 문제를 풀 때 종종 소문자로 이루어진 char 문자열을 저장하고 검색할 때 사용해야 하는 경우가 있습니다. 이런 경우 문자열을 숫자로 변경하면 다루기가 쉬워집니다.
a-z 까지(26개) 소문자를 표현하기 위해서는 최소 5bit(32가지 상태 표현 가능) 가 필요합니다. 숫자를 저장할 자료형을 int(32bit) 로 하면 마지막 문자열 ‘\0’ 을 포함하여 대략 6자까지 표현이 가능합니다. 만약 int 가 아닌 unsigned long long (64bit) 로 하면 12자까지 숫자로 표현이 가능합니다.
typedef unsigned long long LL;
LL str_to_ll(char* str) {
LL ret = 0;
for (int i = 0; str[i] != '\0'; i++) {
ret <<= 5;
ret |= (str[i] - 'a' + 1);
}
return ret;
}
전체 코드
#include <stdio.h>
typedef unsigned long long LL;
LL str_to_ll(char* str) {
LL ret = 0;
for (int i = 0; str[i] != '\0'; i++) {
ret <<= 5;
ret |= (str[i] - 'a' + 1);
}
return ret;
}
void ll_to_str(LL ll, char* ret, int size) {
LL mask = 31;
for (int i = size - 1; i >= 0; i--) {
ret[i] = (ll & mask) + 'a' - 1;
ll >>= 5;
}
ret[size] = '\0';
return ret;
}
int main() {
// encoding
char str[6] = "abc";
LL enc = str_to_ll(str);
printf("%llu\n", enc);
// decoding
char dec[6];
ll_to_str(enc, dec, 3);
printf("%s\n", dec);
return 0;
}
출력
1091
abc
Comments