본문 바로가기

Algorithm/Code Fights (Code Signal)

Aracade Intro #10 CommonCharacterCount


CodeFights arcade intro #10


 Given two strings, get the total number of common characters between them. 


 주어진 2개의 String에서, 똑같은 Character의 총 개수를 구하라.



//Process

//1. Input two strings

//2. Iterate first string from begin to the end

// 2.1. If the number is not existed in the charArray1, then add and count

// 2.2. If existed, just count

//3. Iterate second string from begin to the end

// 3.1. If the number is not existed in charArray2, then add and count

// 3.2. If existed, just count

//4. Iterate any charArray

// 4.1. Check if the same char is in another charArray

//  4.1.1. If so, add smaller count in countArray to countSum

//5. Return countSum



//처리과정

//1. 문자열 2개를 입력받는다.

//2. 첫번째 string 처음부터 끝까지 반복한다.

// 2.1. 처음 나온 숫자면 배열1에 추가하고, 카운트배열1에 추가한다.

// 2.2. 있던 숫자면 해당 인덱스의 카운트를 센다.

//3. 두번째 string 처음부터 끝까지 반복한다.

// 3.1. 처음 나온 숫자면 배열2에 추가하고, 카운트배열2에 추가한다.

// 3.2. 있던 숫자면 해당 인덱스의 카운트를 센다.

//4. 숫자배열1이나 2 중 length 까지 반복

// 4.1. 해당 배열 숫자가 다른 배열에 있으면 해당 인덱스의 카운트배열1,2 중 작은 카운트를 카운트합에 더한다.

//5. 카운트합 출력한다.



int commonCharacterCount(std::string s1, std::string s2) {


    int countSum = 0;

    

    std::vector<string> charArray1;

    std::vector<string> charArray2;

    std::vector<int> countArray1;

    std::vector<int> countArray2;

    int s1Length = s1.length();

    int s2Length = s2.length();

    

    string tempChar;

    bool isExist;

    int j;


    for (int i = 0; i < s1Length; ++i) 

    {

        tempChar = s1.at(i);

        isExist = false;

        j = 0;

        while (j < charArray1.size() && !isExist) 

        {

            if (charArray1.at(j) == tempChar) 

            {

                isExist = true;

            }

            ++j;

        }

        if (isExist) 

        {

            countArray1.insert(countArray1.begin() + j - 1, ++countArray1.at(j - 1));

            countArray1.erase(countArray1.begin() + j);

        }

        else

        {

            charArray1.push_back(tempChar);

            countArray1.push_back(1);

        }

    }

    

    for (int i = 0; i < s2Length; ++i) 

    {

        tempChar = s2.at(i);

        isExist = false;

        j = 0;

        while (j < charArray2.size() && !isExist) 

        {

            if (charArray2.at(j) == tempChar) 

            {

                isExist = true;

            }

            ++j;

        }

        if (isExist) 

        {

            countArray2.insert(countArray2.begin() + j - 1, ++countArray2.at(j-1));

            countArray2.erase(countArray2.begin() + j);

        }

        else {

            charArray2.push_back(tempChar);

            countArray2.push_back(1);

        }

    }

    

    //숫자배열1, 카운트배열1, 숫자배열2, 카운트배열2 를 비교

    int length1 = charArray1.size();

    for (int i = 0; i < length1; ++i) 

    {

        tempChar = charArray1.at(i);

        isExist = false;

        j = 0;

        while (j < charArray2.size() && isExist == false) 

        {

            if (charArray2.at(j) == tempChar) 

            {

                isExist = true;

            }

            ++j;

        }

        if (isExist) 

        {

            int tempCount;

            if (countArray1.at(i) < countArray2.at(j-1)) 

            {

                tempCount = countArray1.at(i);

            }

            else 

            {

                tempCount = countArray2.at(j-1);

            }

            countSum += tempCount;

        }

    }

    return countSum;

}