알고리즘 문제 시 특히 소문자를 대문자로 변경 또는 대문자를 소문자로 변경하는 문제가 나오게 됩니다. 이 때 어떤 식으로 변경하면 손쉽게 변경할 수 있는 지 알아보겠습니다. 크게 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 하나 정도만 외워도 될 것 같지만 생각하는 시간이 오래 걸릴 것 같다는 판단에서 입니다. 본인 취향에 맞게 사용하면 좋을 것 같습니다.
'C C++ > C C++ 유용한 알고리즘 기법' 카테고리의 다른 글
[C/C++] 거듭제곱 함수 만들기 (0) | 2022.07.16 |
---|---|
[C/C++] 정수 자릿수 세기 (0) | 2022.07.16 |
[C/C++] 입력 받은 숫자 특정 자릿수 접근하기 (0) | 2022.07.09 |
[C/C++] 최솟값 최댓값 찾기 (0) | 2022.07.09 |
C언어 char형과 char*형 차이, %s, %c의 차이 (0) | 2022.07.03 |
댓글