문제 링크입니다: http://www.codewars.com/kata/57814d79a56c88e3e0000786/train/cpp
문제 해석하는게 진짜 힘들었습니다. 2nd char을 계속 두번째 문자라고만 해석해서 처음에 접근을 완전 엉뚱하게 했습니다.
every 2nd char이라고 하면 짝수번째 인덱스에 있는 문자라고 해석했어야했네요.
/*
문자열을 암호화하는 방법:
짝수번째 문자들을 모두 이어붙인 뒤 뒤에 홀수번째 문자들을 모두 이어붙인다
이 것을 n번 진행하시오!
또한 복호화하는 함수도 작성하시오
*/
#include <iostream>
#include <string>
using namespace std;
std::string encrypt(std::string text, int n)
{
int length = text.length(); //매개변수로 전달받은 문자열의 길이
std::string odd = ""; //홀수번째 문자 저장
std::string even = ""; //짝수번째 문자 저장
if (n <= 0 || length == 0) //문제 조건
return text;
for (int i = 0; i < length; i++) //짝수번째 문자는 even에 홀수번째 문자는 odd에 저장
if (i % 2 == 0)
even += text[i];
else
odd += text[i];
odd.append(even); //둘이 합친다
//n이 1이 될 때까지 재귀
if (n == 1)
return odd;
else
return encrypt(odd, n - 1);
}
std::string decrypt(std::string encryptedText, int n)
{
int mid = encryptedText.length() / 2; //반복문을 실행하는 횟수를 좌지우지하기 때문에 문자열의 길이의 반을 저장
int cnt = 0; //짝수번째 문자를 더하기 위해 필요한 변수
std::string result = "";
if (n <= 0 || mid == 0) //문제 조건
return encryptedText;
int trial = encryptedText.length() % 2 == 1 ? mid + 1 : mid; //문자열의 길이가 홀수면 mid+1, 짝수면 mid
for (int i = 0; i < trial; i++)
{
result += encryptedText[mid + cnt]; //홀수번쨰 문자 저장
if (cnt < mid) //cnt가 mid보다 안 클때까지 짝수번째 문자 저장
result += encryptedText[cnt];
cnt++;
}
//마찬가지로 재귀
if (n == 1)
return result;
else
return decrypt(result, n - 1);
}
int main(void)
{
std::string text = "This is a test!";
cout << encrypt(text, 0) << endl;
cout << decrypt(encrypt(text, 0), 0) << endl << endl;
cout << encrypt(text, 1) << endl;
cout << decrypt(encrypt(text, 1), 1) << endl << endl;
cout << encrypt(text, 2) << endl;
cout << decrypt(encrypt(text, 2), 2) << endl << endl;
cout << encrypt(text, 3) << endl;
cout << decrypt(encrypt(text, 3), 3) << endl << endl;
cout << encrypt(text, 4) << endl;
cout << decrypt(encrypt(text, 4), 4) << endl << endl;
cout << encrypt(text, -1) << endl;
cout << decrypt(encrypt(text, -1), -1) << endl << endl;
cout << encrypt("This kata is very interesting!", 1) << endl;
cout << decrypt(encrypt("This kata is very interesting!", 1), 1) << endl << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > codewars' 카테고리의 다른 글
codewars: Tank Truck (0) | 2018.01.30 |
---|---|
codewars: Statistics for an Athletic Association (0) | 2018.01.30 |
codewars: Build a pile of Cubes (0) | 2018.01.29 |
codewars: Fibonacci, Tribonacci and friends (0) | 2018.01.29 |
codewars: Consecutive strings (0) | 2018.01.29 |