Open ID와 Recaptcha가 당분간 지원되지 않습니다. 새 버전의 PHP에서 해당 확장기능이 제대로 작동하지 않습니다. 최대한 빨리 복구해보겠습니다.
문자열 뒤집기
세그멘테이션 폴트
목차 |
문제 1
본인에게 가장 편한 프로그래밍 언어로 문자열의 순서를 뒤집는 함수를 만드시오.
시즈하(Sizuha)의 답
template<typename T> inline void swap(T& __a, T& __b) { T __tmp = __a; __a = __b; __b = __tmp; } const char* reverse(char* text, size_t length) { const int maxCnt = length / 2; for (int i = 0; i < maxCnt; ++i) swap(text[i], text[length - i - 1]); return text; }
swap()은 직접 구현하는 대신, STL의 std::swap() 같이 이미 구현되어 있는 swap 함수를 이용할 수 있습니다.
"12345678"
위와 같은 문자열이 있다고 할 때, 1 ↔ 8, 2 ↔ 7, 3 ↔ 6, 4 ↔ 5 와 같은 방식으로 문자의 위치를 바꿉니다. 만약 홀수개일 때는 정중앙의 문자는 자리 바꿈을 할 필요가 없습니다.
이 경우, 문자열 길이의 절반만큼만 루프를 돌면 됩니다.
문제 2
다음과 같은 두 자짜리 문자열을 뒤집는 함수 reverse가 있다.
string str = reverse("AB"); Assert.AreEquals("BA", str);
함수 reverse를 이용해 길이가 3이상인 문자열을 뒤집는 함수 reverse2를 구현해보시오.
린(Lyn Tohno)의 답
아래와 같이 풀면 됩니다.
void reverse2(char* Original, int Length) { for (int j = Length-1; j >= 0 ; --j) { for (int i = 0;i < j ; ++i) { reverse(Original + i); } } }
첨언하면 변환 과정은 다음과 같습니다.
ABCDEF BACDEF BCADEF BCDAEF BCDEAF BCDEFA CBDEFA CDBEFA CDEBFA CDEFBA DCEFBA DECFBA DEFCBA EDFCBA EFDCBA FEDCBA

