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

C++로 N의 자릿수를 조합해 만들 수 있는 알파벳 ASCII 값 개수 구하기

양의 정수가 담긴 long 타입 변수가 입력으로 주어집니다. 이 문제의 목표는 입력 숫자의 자릿수들을 조합하여 영어 알파벳의 ASCII 값을 만들 수 있을 때, 해당하는 알파벳의 개수를 구하는 것입니다.

숫자에서 임의의 두 자릿수를 골라 배열하면 영어 알파벳의 ASCII 값을 형성할 수 있습니다. 대문자 A~Z의 ASCII 값은 65부터 90까지이며, 소문자 a~z의 ASCII 값은 97부터 122까지입니다.

따라서 확인해야 할 전체 알파벳의 수는 26 + 26 = 52개입니다.

예제로 이해하기

예시 1

입력 - N_digits = 163465

출력 - N의 자릿수로 ASCII 값을 만들 수 있는 알파벳의 개수: 2

설명 - 163465의 자릿수로 만들 수 있는 ASCII 값은 65와 66뿐입니다. 따라서 가능한 알파벳은 두 개입니다.

예시 2

입력 - N_digits = 902349

출력 - N의 자릿수로 ASCII 값을 만들 수 있는 알파벳의 개수: 2

설명 - 902349의 자릿수로 만들 수 있는 ASCII 값은 90과 99뿐입니다. 따라서 가능한 알파벳은 두 개입니다.

접근 방법

이 접근 방식에서는 먼저 입력 숫자에 포함된 각 자릿수의 빈도를 저장하기 위한 빈도 배열 total[10]을 생성합니다. 그다음 65~90 범위와 97~122 범위의 각 숫자 i에 대해 i의 자릿수를 추출하고 빈도 배열에서 검색합니다. i의 모든 자릿수가 빈도 배열에 존재한다면(모든 자릿수에 대해 total[현재 자릿수]가 0이 아니라면) count를 증가시킵니다.

  • long int 타입의 N_digits를 입력받습니다.
  • check(int arr[], int val) 함수는 빈도 배열 arr[]과 ASCII 숫자 val을 입력받아, val이 arr[]의 자릿수들로 만들어질 수 있으면 true를 반환합니다.
  • for 루프를 사용해 빈도 배열의 복사본 total[10]을 만듭니다.
  • while 루프를 사용해 val의 각 자릿수를 추출하고 total[]에서 검색합니다.
  • total[자릿수]가 0이면 false를 반환하고, 그렇지 않으면 해당 자릿수를 사용한 것으로 처리하여 개수를 1 감소시킵니다.
  • 다음 최하위 자릿수(LSB)를 검사하기 위해 val을 줄여 나갑니다.
  • while 루프가 끝까지 실행되면 val은 total[]의 자릿수들로 만들 수 있으므로 true를 반환합니다.
  • ASCII_N(long long int N_digits) 함수는 입력 숫자를 받아 N의 자릿수로 ASCII 값을 만들 수 있는 알파벳의 개수를 반환합니다.
  • 초기 count를 0으로 설정하고 빈도 배열 total[10]을 0으로 초기화합니다.
  • while 루프를 사용해 N_digits의 각 자릿수에 대한 빈도 배열을 채웁니다. LSB를 values = N_digits % 10으로 추출하고 total[values]를 1 증가시킵니다.
  • N_digits를 10으로 나누어 줄입니다.
  • for 루프를 사용해 97부터 122까지, 그리고 65부터 90까지의 알파벳 ASCII 값을 순회합니다.
  • check(total, i)가 true를 반환하면 count를 증가시킵니다.
  • 두 for 루프가 모두 끝나면 count를 결과로 반환합니다.

예제 코드

#include<bits/stdc++.h>
using namespace std;

bool check(int arr[], int val) {
    int total[10];
    for (int i = 0; i < 10; i++) {
        total[i] = arr[i];
    }
    while (val > 0) {
        int values = val % 10;
        if (total[values] == 0) {
            return false;
        } else {
            total[values]--;
        }
        val = floor(val / 10);
    }
    return true;
}

int ASCII_N(long long int N_digits) {
    int count = 0;
    int total[10] = {
        0
    };

    while (N_digits > 0) {
        int values = N_digits % 10;
        total[values]++;
        N_digits = floor(N_digits / 10);
    }
    for (int i = 97; i <= 122; i++) {
        if (check(total, i)) {
            count++;
        }
    }
    for (int i = 65; i < 91; i++) {
        if (check(total, i)) {
            count++;
        }
    }
    return count;
}
int main() {
    long long int N_digits = 251326;
    cout << "Count of alphabets whose ASCII values can be formed with the digits of N are: " << ASCII_N(N_digits);
}

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

출력

Count of alphabets whose ASCII values can be formed with the digits of N are: 2