알고리즘/codewars

codewars: Simple Encryption #1 - Alternating Split

꾸준함. 2018. 1. 30. 00:56

문제 링크입니다: 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