본문 바로가기
C C++/C C++ 유용한 알고리즘 기법

[C/C++] 소문자-대문자 변환, 대문자-소문자 변환

by Go! Jake 2022. 7. 10.

알고리즘 문제 시 특히 소문자를 대문자로 변경 또는 대문자를 소문자로 변경하는 문제가 나오게 됩니다. 이 때 어떤 식으로 변경하면 손쉽게 변경할 수 있는 지 알아보겠습니다. 크게 3가지입니다. 단순 덧셈뺄셈연산,  비트 연산자 사용, 마지막으로 toupper() 함수와 tolower() 함수 사용입니다.

덧셈뺄셈 연산으로 소문자 대문자 변환하기

소문자가 대문자보다 32 큽니다. 둘 다 ASCII 코드입니다.

소문자 a와 z는 정수로 각각 97과 122를 가지고 있습니다.

대문자 A와 Z는 정수로 각각 65과 97을 가지고 있습니다.

 

적절히 32를 빼거나 더해줌으로써 소문자 대문자 변환을 할 수 있습니다.

아래는 입력된 "HeLLo"를 모두 소문자로 변경하는 코드입니다.

 

대문자 범위는 65~90이며, 소문자 범위는 97~122입니다.

#include <iostream>
#include <cstring>

int main() 
{
	char arr[10]="HeLLo";
	char str[10];
	
	for (int i = 0; i<10; i++)
	{
		if ((arr[i]>=65) && (arr[i]<=90))
			str[i]=arr[i]+32;
		else str[i]=arr[i];
	}
	printf("%s",str);
	 	
	return 0;
}

비트 연산자 사용

32씩 차이 나기 때문에 BIT5가 1이냐 아니냐가 중요합니다.

소문자는 32만큼 크기 때문에 값에 BIT5가 1일 것이고, 대문자는 BIT가 0일 것입니다.

#include <iostream>
#include <cstring>

int main() 
{
	char arr[10]="HeLLo";
	char str[10];
	
	for (int i = 0; i<10; i++)
	{
		if (arr[i]&(32))
			str[i]=arr[i];
		else 
		{
			arr[i]|=32;
			str[i]=arr[i];
		}
	}
	printf("%s",str);
	 	
	return 0;
}

여기선 몇 가지 설명을 하겠습니다. 우선 아래 조건입니다.

		if (arr[i]&(32))

arr[i]가 가진 값과 32를 비트별로 비교합니다. 그리고 AND 연산합니다.

예를 들어,

0b0100 00001 (arr[i])이고

0b0001 0000 (32) 둘을 비교했을 때 bit5번이 두 개 다르기 때문에 둘은 전체 값이 0이 됩니다.

bit5번이 0이라는 의미는 대문자라는 의미입니다. 따라서 else로 빠지게 됩니다.

else로 빠지면 다음과 같은 표현이 나옵니다.

			arr[i]|=32;

bit OR 조건입니다. 32가 bit 5번이므로 arr[i]의 bit5번이 1이 되게 되고, 소문자로 변경됩니다.

toupper() 함수 사용하기 또는 tolower() 함수 사용하기

단순히 toupper() 등의 함수를 사용하게 안에 문자열을 넣으면 변경됩니다.

#include <iostream>
#include <cstring>

int main() 
{
	char arr[10]="HeLLo";
	char str[10];
	
	for (int i = 0; i<10; i++)
	{
		str[i]=tolower(arr[i]);
	}
	printf("%s",str);
	 	
	return 0;
}
결론

세 가지 방법에 대해서 살펴 보았는 데요, 제 경우엔 공부 겸 비트연산을 사용하거나 toupper() 또는 tolower() 함수를 사용할 것 같습니다. 셋 다 좋은 방법이고 덧셈뺄셈 방법도 좋은 데, 65 90 97 122 값을 알고 있어야 하고 최소 65 하나 정도만 외워도 될 것 같지만 생각하는 시간이 오래 걸릴 것 같다는 판단에서 입니다. 본인 취향에 맞게 사용하면 좋을 것 같습니다.

댓글