안녕지구 #developer #bompapa

소소한팁 - 문자열을 숫자로 변환하기

|

알고리즘 문제를 풀 때 종종 소문자로 이루어진 char 문자열을 저장하고 검색할 때 사용해야 하는 경우가 있습니다. 이런 경우 문자열을 숫자로 변경하면 다루기가 쉬워집니다.

a-z 까지(26개) 소문자를 표현하기 위해서는 최소 5bit(32가지 상태 표현 가능) 가 필요합니다. 숫자를 저장할 자료형을 int(32bit) 로 하면 마지막 문자열 ‘\0’ 을 포함하여 대략 6자까지 표현이 가능합니다. 만약 int 가 아닌 unsigned long long (64bit) 로 하면 12자까지 숫자로 표현이 가능합니다.

숫자로 한 번 변경되면 MOD 연산을 하여 Hash 값으로 사용할 수도 있습니다.
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