길이가 N인 문자열 S가 주어졌다고 가정해 봅시다. 문자열 S는 'A', 'B', 'C' 세 종류의 대문자로만 구성되어 있으며, 정수 K도 함께 주어집니다. 우리가 해야 할 일은 문자열 S에서 K번째 문자를 소문자로 변환한 뒤 결과를 출력하는 것입니다.
예를 들어, 입력이 K = 2, S = "AABACC"라면 두 번째 문자 'A'가 소문자로 바뀌어 출력 결과는 "AaBACC"가 됩니다.
해결 접근 방식
이 문제는 아스키(ASCII) 코드의 성질을 이용하면 아주 간단하게 해결할 수 있습니다. 대문자의 아스키 코드 값은 65~90 범위에 있고, 소문자는 97~122 범위에 있습니다. 즉, 같은 알파벳의 소문자는 대문자보다 항상 32만큼 큰 값을 가집니다.
따라서 해결 단계는 다음과 같습니다.
- K번째 문자(배열 인덱스 기준으로 K-1번째)에 32를 더해 소문자로 변환합니다.
- 변환된 문자열을 그대로 반환합니다.
S[K - 1] = S[K - 1] + 32 return S
C++ 구현 예제
아래 예제 코드를 통해 실제 동작을 확인해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
string solve(int K, string S){
S[K - 1] = S[K - 1] + 32;
return S;
}
int main(){
int K = 2;
string S = "AABACC";
cout << solve(K, S) << endl;
}입력
K = 2, S = "AABACC"
출력
AaBACC
코드 설명
solve() 함수는 전달받은 문자열 S의 K-1 인덱스 위치에 있는 문자에 32를 더하여 해당 대문자를 소문자로 바꿉니다. 이후 수정된 문자열을 반환하고, main() 함수에서 이를 화면에 출력합니다.
참고로 C++에서는 tolower() 함수를 사용하는 방법도 있습니다. S[K - 1] = tolower(S[K - 1]);과 같이 작성하면 아스키 코드 값을 직접 계산하지 않고도 동일한 결과를 얻을 수 있어 가독성 측면에서 더 권장되기도 합니다.
이 알고리즘은 단순히 한 문자만 변경하므로 시간 복잡도는 O(1)이며, 추가 메모리 사용 없이 문자열 자체를 수정하므로 공간 복잡도 역시 O(1)로 매우 효율적입니다.