이 튜토리얼에서는 문자열과 정수 k가 주어졌을 때, ASCII 값이 k와 서로소(co-prime)인 모든 소문자를 대문자로 변환하는 프로그램을 C++로 구현하는 방법을 알아봅니다.
문제 개요
주어진 조건은 다음과 같습니다.
- 하나의 문자열과 하나의 정수 값 k가 입력으로 제공됩니다.
- 문자열을 처음부터 끝까지 순회하면서 각 문자의 ASCII 값을 확인합니다.
- 해당 문자가 소문자('a'~'z')이고, 그 ASCII 값이 k와 서로소(최대공약수가 1)라면 대문자로 변환합니다.
여기서 서로소란 두 수의 최대공약수(GCD)가 1인 경우를 의미합니다. 예를 들어, 소문자 't'의 ASCII 값은 116이고 k가 3일 때 gcd(116, 3) = 1이므로 'T'로 변환됩니다.
구현 예제
#include <bits/stdc++.h>
using namespace std;
// 주어진 문자열을 조건에 맞게 수정하는 함수
void convert_string(string s, int k){
int l = s.length();
for (int i = 0; i < l; i++) {
int ascii = (int)s[i];
// 소문자이면서 ASCII 값이 k와 서로소인지 확인
if (ascii >= 'a' && ascii <= 'z' && __gcd(ascii, k) == 1) {
char c = s[i] - 32;
s[i] = c;
}
}
cout << s << "\n";
}
int main(){
string s = "tutorialspoint";
int k = 3;
convert_string(s, k);
return 0;
}실행 결과
TuToriAlSPoiNT
코드 설명
- convert_string 함수: 문자열의 길이만큼 반복문을 돌며 각 문자를 검사합니다.
- 조건 검사: 문자가 소문자 범위(97~122)에 속하고,
__gcd(ascii, k) == 1조건을 만족하면 서로소입니다. - 대소문자 변환: 소문자와 대문자의 ASCII 값 차이는 32이므로,
s[i] - 32연산으로 간단히 대문자로 바꿀 수 있습니다. 물론toupper()함수를 사용해도 동일한 결과를 얻을 수 있습니다.
예제에서 k = 3일 때, 'tutorialspoint' 문자열 중 ASCII 값이 3과 서로소인 소문자들만 대문자로 변경되어 최종적으로 TuToriAlSPoiNT가 출력됩니다.