Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 비트 연산으로 알파벳 내 문자 위치 찾는 방법

문제 개요

이 문제에서는 영어 알파벳으로 이루어진 문자열 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() 같은 변환 함수 없이 단 한 줄의 비트 연산만으로 원하는 결과를 얻을 수 있어, 실행 속도 면에서도 매우 효율적인 방법입니다.