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

C++에서 ASCII 값의 합이 k보다 작거나 큰 단어 개수 구하기


문장을 담고 있는 문자열 str과 정수 k가 주어졌을 때, str에 포함된 단어 중 각 단어의 ASCII 값 합이 k보다 작은 단어의 개수와 k보다 큰 단어의 개수를 구하는 것이 이 문제의 목표입니다.

ASCII란 언어 내 모든 문자에 고유한 번호를 부여한 코드 체계를 의미합니다.

예제로 이해하기

입력 − str = "This is ASCII", k = 300

출력 − ASCII 값의 합이 k보다 작은 단어 개수: 1
ASCII 값의 합이 k보다 큰 단어 개수: 2

설명 − 단어 "is"의 ASCII 값 합은 300보다 작으며, 나머지 두 단어("This", "ASCII")는 모두 300보다 큽니다.

입력 − str = "set set set", k = 300

출력 − ASCII 값의 합이 k보다 작은 단어 개수: 0
ASCII 값의 합이 k보다 큰 단어 개수: 3

설명 − 모든 단어가 서로 동일하며, ASCII 값의 합이 모두 300보다 큽니다.

프로그램에서 사용한 접근 방식

for 반복문을 사용해 문자열 str을 한 글자씩 순회하면서, 각 단어를 구성하는 문자들의 ASCII 값을 temp에 차례대로 더합니다. 공백 문자를 만나 한 단어가 끝나면 지금까지 누적된 temp 값과 k를 비교하여 해당 단어를 분류합니다.

  • 문자열 str과 정수 k를 입력받습니다.
  • 함수 words_less_greater(string str, int k, int length)는 문자열을 받아 ASCII 값의 합이 k보다 작은 단어와 큰 단어의 개수를 계산합니다.
  • str 내 각 단어의 ASCII 값 합을 임시로 저장할 변수 temp를 0으로 초기화합니다.
  • ASCII 값의 합이 k보다 작은 단어의 개수를 셀 변수 count를 0으로 초기화합니다.
  • 전체 단어의 개수를 셀 변수 total을 0으로 초기화합니다.
  • for 반복문으로 str을 처음부터 끝까지 순회합니다.
  • 공백 문자(str[i] == ' ')를 만나면 단어 하나가 끝난 것이므로, temp가 k보다 작은지 확인합니다. 참이라면 count를 증가시키고, 이후 temp를 0으로 초기화하면서 total을 증가시킵니다.
  • temp가 k 이상이라면 total만 증가시킵니다.
  • 공백이 아닌 일반 문자라면 해당 문자의 ASCII 값을 temp에 더합니다.
  • 반복문이 끝난 후에는 공백 없이 문자열이 끝나는 마지막 단어도 같은 방식으로 처리합니다.
  • 최종적으로 count에는 ASCII 값의 합이 k보다 작은 단어 수가 저장되며, total - count는 k보다 큰 단어 수가 됩니다.
  • 결과를 출력합니다.

예제

#include <bits/stdc++.h>
using namespace std;
void words_less_greater(string str, int k, int length){
    int temp = 0;
    int total = 0;
    int count = 0;
    for (int i = 0; i < length; ++i){
        if (str[i] == ' '){
            if (temp < k){
                count++;
            }
            temp = 0;
            total++;
        }
        else{
            temp += str[i];
        }
    }
    total++;
    if (temp < k){
        count++;
    }
    cout<<"Count of number of words having sum of ASCII values less than k are: "<< count;
    cout<<"\nCount of number of words having sum of ASCII values greater than k are: "<< total -
    count;
}
int main(){
    string str = "tutorials point";
    int k = 900;
    int length = str.length();
    words_less_greater(str, k, length);
    return 0;
}

출력

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

Count of number of words having sum of ASCII values less than k are: 1
Count of number of words having sum of ASCII values greater than k are: 1

참고로 위 예제에서 "point"의 ASCII 값 합은 554로 900보다 작고, "tutorials"의 합은 999로 900보다 큽니다. 따라서 두 범주 각각에 단어가 하나씩 속하게 되는 것입니다.