임의의 문자열 $S$가 있을 때, 문자열의 가운데에 있는 글자를 반환해야 한다.
문자열의 길이가 짝수일 경우 중간의 2글자를 반환한다.
난 1차로 아래와 같이 답을 냈다.
#include <string>
#include <locale>
#include <codecvt>
using namespace std;
string wstringToString(const std::wstring& wstr) {
wstring_convert<codecvt_utf8<wchar_t>, wchar_t> converter;
return converter.to_bytes(wstr);
}
string solution(int n) {
wstring base = L"수박";
wstring answer;
for (int i = 0; i < n; ++i)
answer += base[i % 2];
return wstringToString(answer);
}
흠...
유니코드 장난질 때문에 이렇게 까지 해야 한다고?
라는 생각이 머리에 가득 찼다.
이걸 의도하진 않았을 터. 다른 방법을 생각해 보기로 했다.
그러다 떠오른 것이 ``string``의 특성.
``string``은 일반적으로 1바이트를 가진다.
2바이트 이상을 가지는 멀티바이트 문자를 여러 개의 ``char``를 통해 처리할 수 있지만,
이걸로 다 처리하기엔 적절하지 못하다.
``string``은 ``char``의 배열이기 때문에 인덱스로 접근하면 당연히 제대로 된 값을 불러오지 못한다.
하지만 그렇다고 해서 ``wstring``을 꼭 써야만 하는 것은 아니다.
따라서 base 스트링을 선언해 사용하는 것이 아니라 문자 자체를 임의로 삽입하는 것이다.
string solution(int n) {
string answer;
for (int i = 0; i < n; ++i)
answer += (i & 1) ? "박" : "수";
return answer;
}
홀짝 구분을 하고 바로 "수"와 "박"을 ``answer``에 삽입한다.
이러면 ``string``을 인덱스로 접근할 때 발생하는 문제를 신경 쓰지 않아도 되고 코드가 매우 간결해진다.
하 참... 이 단순한걸 왜 이리 어렵게 빙빙 돌아갔을까.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #19] 사각형 별 찍기 (0) | 2024.07.17 |
---|---|
[TIL #18] 약수의 개수와 덧셈 (0) | 2024.07.12 |
[TIL #16] 없는 숫자 더하기 (0) | 2024.07.10 |
[TIL #15] 콜라츠 추측 (0) | 2024.07.09 |
[TIL #14] 정수 내림차순으로 배치하기 (0) | 2024.07.04 |