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



재훈이의 공간