문제 개요
이 문제에서는 영어 알파벳으로 이루어진 문자열 str이 주어지며, 우리의 목표는 비트 연산(bit operation)을 사용해 각 문자의 알파벳상 위치를 찾는 것입니다.
문제 설명: 문자열의 각 문자가 영어 알파벳에서 몇 번째에 해당하는지 그 순번을 반환해야 합니다.
문자열의 문자는 대소문자를 구분하지 않습니다. 즉, "t"와 "T"는 동일한 문자로 취급됩니다.
예제로 문제 이해하기
입력: str = "Tutorialspoint"
출력: 20 21 20 15 18 9 1 12 19 16 15 9 14 20
첫 글자 'T'는 알파벳에서 20번째, 다음 글자 'u'는 21번째인 식으로 각 문자의 순번이 차례대로 출력됩니다.
해결 접근 방법
문자의 알파벳 위치를 구하는 가장 간단한 방법은 해당 문자와 31을 AND(&) 비트 연산하는 것입니다.
그 원리는 다음과 같습니다. ASCII 코드에서 대문자 'A'~'Z'는 65~90, 소문자 'a'~'z'는 97~122의 값을 가지는데, 하위 5비트(0b11111 = 31)만 마스킹해서 남기면 알파벳 순번인 1~26이 정확히 얻어집니다. 예를 들어 'A'(ASCII 65)와 31을 AND하면 1, 'a'(ASCII 97)와 31을 AND해도 역시 1이 됩니다. 덕분에 별도의 대소문자 변환 없이도 두 경우를 한 번에 처리할 수 있습니다.
솔루션 동작을 보여주는 프로그램
예제 코드
#include <iostream>
using namespace std;
void findLetterPosition(string str, int n) {
for (int i = 0; i < n; i++) {
cout<<(str[i] & 31) << " ";
}
}
int main() {
string str = "TutorialsPoint";
int n = str.length();
cout<<"The letters position in string "<<str<<" is \n";
findLetterPosition(str, n);
return 0;
}출력 결과
The letters position in string TutorialsPoint is 20 21 20 15 18 9 1 12 19 16 15 9 14 20
코드를 살펴보면 findLetterPosition 함수가 문자열의 각 문자를 순회하며 str[i] & 31 연산 결과를 출력합니다. 조건문이나 tolower() 같은 변환 함수 없이 단 한 줄의 비트 연산만으로 원하는 결과를 얻을 수 있어, 실행 속도 면에서도 매우 효율적인 방법입니다.