문장을 담고 있는 문자열 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보다 큽니다. 따라서 두 범주 각각에 단어가 하나씩 속하게 되는 것입니다.