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

C++에서 [l, r] 범위에 포함되지 않는 ASCII 값을 가진 알파벳 세고 출력하기

임의의 길이를 가진 문자열이 주어졌을 때, 문자열 안에서 ASCII 값이 지정된 범위 [l, r]에 속하지 않는 알파벳의 개수를 계산하고 해당 알파벳을 출력하는 것이 이번 글의 목표입니다.

대문자 A~Z의 ASCII 값

ABCDEFGHIJKLMNOPQRS
65666768697071727374757677787980818283
TUVWXYZ
84858687888990

소문자 a~z의 ASCII 값

abcdefghijklmnopqrs
979899100101102103104105106107108109110111112113114115
tuvwxyz
116117118119120121122

예시

입력 − String str = "point"
      First = 111, Last = 117
출력 − 범위에 포함되지 않는 문자: i, n
      개수: 2

설명 − 'i'(105)와 'n'(110)은 [111, 117] 범위에 속하지 않으므로 이 두 문자가 카운트됩니다.

입력 − String str = "ABCZXY"
      First = 65, Last = 70
출력 − 범위에 포함되지 않는 문자: Z, X, Y
      개수: 3

설명 − 'Z'(90), 'X'(88), 'Y'(89)는 [65, 70] 범위에 속하지 않으므로 이 세 문자가 카운트됩니다.

프로그램에 적용된 접근 방식

  • 문자열과 함께 범위를 구성할 시작 값(start)과 끝 값(end)을 입력받아 변수 str 등에 저장합니다.
  • length() 함수를 사용해 문자열의 길이를 구합니다. 이 함수는 공백을 포함한 문자열 내 문자 수에 해당하는 정수 값을 반환합니다.
  • 조건에 맞는 문자의 개수를 저장할 임시 변수를 준비하고, 이미 출력된 문자를 추적하기 위한 맵(m)을 생성합니다.
  • i가 0부터 문자열 길이 미만일 때까지 반복문을 실행합니다.
  • 반복문 안에서 start ≤ str[i] ≤ end 조건을 검사하여 해당 문자가 범위 밖에 있는지 확인합니다.
  • 범위 밖의 문자라면 개수를 증가시키고, m[str[i]]의 값이 1이 아니면 해당 문자를 출력한 뒤 m[str[i]]를 1 증가시켜 동일한 문자가 중복 출력되지 않도록 합니다.
  • 최종 개수를 반환합니다.
  • 결과를 출력합니다.

예제 코드

#include <iostream>
#include <unordered_map>
using namespace std;
// ascii 값이 [l, r] 범위에 없는 문자의 개수를 세는 함수
int count_non_char(string str, int left, int right){
    int count = 0;
    // 각 문자를 한 번만 출력하기 위해 map 사용
    unordered_map<char, int> m;
    int len = str.length();
    for (int i = 0; i < len; i++) {
        if (!(left <= str[i] and str[i] <= right)){
            count++;
            if (m[str[i]] != 1){
                cout << str[i] << " ";
                m[str[i]]++;
            }
        }
    }
    // 개수 반환
    return count;
}
// 메인 코드
int main(){
    string str = "tutorialspoint";
    int left = 102, right = 111;
    cout << "Characters and ";
    cout << "\nand count in the given range is: " << count_non_char(str, left, right);
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −

Characters and
and count in the given range is: t u r a s p 8

"tutorialspoint" 문자열에서 ASCII 값이 [102, 111] 범위에 속하지 않는 문자는 중복을 포함해 총 8개입니다. 이때 해시 맵을 활용해 중복 출력을 방지했기 때문에 화면에는 t, u, r, a, s, p 여섯 개의 고유한 문자만 표시됩니다.