Problem Solving

[Topcoder] SRM297 ~ 303 연습

끄적끄적 2008. 9. 23. 11:46

SRM297 DIV2

class PackingParts
{
public:

    int pack(vector <int> p, vector <int> b)
    {   
        int ret = 0;
        for(int i=0, j=0; i < p.size() && j < b.size(); )
        {
            if(p[i] > b[j]) j++;
            else
            {
                i++; j++; ret++;
            }
        }

        return ret;
    }
};

SRM298 DIV2
: 변환되는걸 일일이 나열하지 않고, 배열로 처리해 봤다. 이런 연습을 많이 해서 익숙해 질 필요가 있음.

class IndicatorMotion
{
public:

    string getMotion(string p, char s)
    {   
        char data[4] = {'\\', '|', '/',  '-'};

        int index = 0;
        REP(i, 4)
            if( s == data[i] ) index = i;

        ostringstream out;
        out << s;

        istringstream in(p);
        char instr;
        int sec;
        while( in >> instr >> sec)
        {
            REP(i, sec)
            {
                if(instr == 'L') index = (index+3)%4;
                if(instr == 'R') index = (index+1)%4;
                if(instr == 'F') index = (index+2)%4;
                out << data[index];
            }
        }
       
        string ret = out.str();
        return ret;
    }
};

SRM299 DIV2
: 일차 방정식 두개로 푸는 문제인데.. 식을 잘못써서 오래걸림;

class TemperatureScales
{
public:

    double convert(int f1, int b1, int f2, int b2, int t)
    {   
        return 1.0*(t-f1)*(f2-b2)/(f1-b1)+f2;

    }
};

SRM300 DIV2
: 습관대로 (double)로 형변환 하지않고, 1.0을 곱했더니, int크기를 넘어버렸다;
항상 overflow가 되지 않는지 확인해야함..

class Taxi
{
public:

    double maxDis(int X, int Y, int t)
    {   
        if( t> X+Y) return -1;
        if( max(X, Y) >= t) return t;       
        int max1 = max(X, Y);
        int min1 = t - max1;

        return sqrt((double)max1*max1+(double)min1*min1);

    }
};

SRM301 DIV2

class InsertionSortCount
{
public:

    int countMoves(vector <int> A)
    {   
        int ret = 0;
        VI s;
        REP(i, A.size())
        {
            REP(j, s.size())
                if(A[i] < s[j]) ret++;

            s.pb(A[i]);
            sort(ALL(s));
        }
        return ret;
    }
};

SRM302 DIV2
: 소스가 좀 지저분하군;

class NounReform
{
public:

    vector <string> makePlural(vector <string> a)
    {   
        REP(i, a.size())
        {
            int n = a[i].size();

            if( n == 1 && ( a[i][n-1] == 's' || a[i][n-1] == 'z' || a[i][n-1] == 'x'))
                a[i] += "es";
            else if( n > 1&& ( a[i][n-1] == 's' || a[i][n-1] == 'z' || a[i][n-1] == 'x' || 
                    (a[i][n-2] == 'c' && a[i][n-1] == 'h') || (a[i][n-2] == 's' && a[i][n-1] == 'h')))
                    a[i] += "es";
            else if( n > 1 &&
                ( a[i][n-1] == 'y' &&
                ( a[i][n-2] == 'a'||a[i][n-2] == 'e'||a[i][n-2] == 'i'||a[i][n-2] == 'o'||a[i][n-2] == 'u')))
                a[i] += "s";
            else if(a[i][n-1] == 'y')
            {
                a[i][n-1] = 'i';
                a[i] += "es";
            }
            else
                a[i] += "s";

        }

        return a;
    }
};

SRM303
: 대놓고 그냥 풀면. 복잡해진다. 간단히 짜는 솔루션 다시 짜 볼 것
반응형