Problem Solving

[Topcoder] SRM348 ~ 360 연습

끄적끄적 2008. 9. 30. 10:19
SRM348 DIV2

class OptimalList
{
public:

    string optimize(string str)
    {   
        int n = 0, s= 0, e= 0, w= 0;
        REP(i, str.size())
        {
            if(str[i] == 'N') n++;
            if(str[i] == 'S') s++;
            if(str[i] == 'E') e++;
            if(str[i] == 'W') w++;
        }

        string ret;
        if(e - w > 0) ret += string(e-w, 'E');
        else ret += string(w-e, 'W');
        if(n-s > 0) ret += string(n-s, 'N');
        else ret += string(s-n, 'S');

        sort(ALL(ret));
        return ret;
    }
};

SRM349 DIV2

class DocumentSearch
{
public:

    int nonIntersecting(vector <string> d, string s)
    {   
        string s1;
        REP(i, d.size()) s1 += d[i];

        int n = s.size();
        int ret = 0;
        REP(i, s1.size())
        {
            string s2 = s1.substr(i, n);
            if( s2 == s)
            {
                ret++;
                i += (n-1);
            }
        }

        return ret;
    }
};

SRM350 DIV2
: 대소문자를 같이 취급한다는 문구를 못봤음. 문제를 잘 볼 것.

class DistanceBetweenStrings
{
public:

    int getDistance(string a, string b, string l)
    {   
        int ret = 0;
        REP(i, l.size())
        {
            int a_c = count(ALL(a), l[i]) + count(ALL(a), toupper(l[i]));
            int b_c = count(ALL(b), l[i]) + count(ALL(b), toupper(l[i]));
            ret += (a_c - b_c) * (a_c - b_c);           
        }
        return ret;
    }
};

SRM351 DIV2

class RoomNumber
{
public:

    string toStr(int num)
    {
        stringstream s;
        s << num;
        return s.str();
    }

    int numberOfSets(int r)
    {           
        VI d;
        string s = toStr(r);
        for(char i= '0'; i<='9'; i++)
        {
            if( i != '6' && i != '9')
                d.pb(count(ALL(s), i));
            else
                d.pb( (count(ALL(s),'6')+count(ALL(s),'9')+1)/2 );
        }
        sort(d.rbegin(), d.rend());
        return d[0];
    }
};

SRM352 DIV2
: if(a/b < 0.75) 로 if문을 짜기보다는 if(4a < 3b) 로 짜는 습관을 들이자.

class AttendanceShort
{
public:

    vector <string> shortList(vector <string> name, vector <string> a)
    {           
        vector<string> ret;
        REP(i, name.size())
        {
            string s = a[i];
            double tot = count(ALL(s), 'P') + count(ALL(s), 'A');
            if( count(ALL(s), 'P')/tot < 0.75)
                ret.pb(name[i]);
        }
        return ret;
    }
};

SRM353 DIV2
: red들은 하나같이 거리 d에서 1e-9를 뺀 수로 비교를 했다. float연산으로 반올림 될 경우를 고려해 준 듯함.

class EllipseCoverage
{
public:

    int calculateCoverage(int x1, int y1, int x2, int y2, int d)
    {       
        int x = d - abs(x1-x2);
        int y = d - abs(y1-y2);
        if(x1 > x2) swap(x1, x2);
        if(y1 > y2) swap(y1, y2);

        int ret = 0;
        for(int i=x1-x; i<= x2+x; i++)
        {
            for(int j=y1-y; j<= y2+y; j++)
            {
                if( d > (sqrt(1.0*(i-x1)*(i-x1) + 1.0*(j-y1)*(j-y1)) + sqrt(1.0*(i-x2)*(i-x2) + 1.0*(j-y2)*(j-y2))))
                    ret++;
            }
        }

        return ret;
    }
};

SRM354 DIV2

class Thimbles
{
public:

    int thimbleWithBall(vector <string> s)
    {       
        int ret = 1;
        REP(i, s.size())
        {
            int a = s[i][0]-'0';
            int b = s[i][2]-'0';
            if( ret == a) ret = b;
            else if(ret == b) ret = a;
        }
        return ret;
    }
};

SRM355 DIV2

class ValueAddedTax
{
public:

    double calculateFinalPrice(string p, int price, vector <string> f)
    {       
        double ret = 0;
        if( find(ALL(f), p) != f.end())
            ret = price + price * 0.1;       
        else
            ret = price + price * 0.18;       

        return ret;
    }
};

SRM356 DIV2
:string.find는 size_t형식의 int값을 반환하고, algorithm의 find는 iterator를 반환한다.
저걸 헷갈려서 좀 삽질했음. string.replace용법도 익혀두자. 나중에 다시 풀어볼 것.

class SMSLanguage
{
public:

    string translate(string t)
    {               
        string s;
        REP(i, t.size())
            if(t[i] != '.' && t[i] != ',' && t[i] != '?' && t[i] != '!') s += t[i];

        REP(i, s.size()) s[i] = tolower(s[i]);

        while(s.find("and") != string::npos || s.find("ate") != string::npos || s.find("at") != string::npos
            ||  s.find("you") != string::npos)
        {
            if( s.find("and") != string::npos )
            {
                s.insert(s.find("and"), "&");
                s.erase(s.find("and"), 3);
            }
            else if( s.find("ate") != string::npos )
            {
                s.insert(s.find("ate"), "8");
                s.erase(s.find("ate"), 3);
            }
            else if( s.find("at") != string::npos )
            {
                s.insert(s.find("at"), "@");
                s.erase(s.find("at"), 2);
            }
            else if( s.find("you") != string::npos )
            {
                s.insert(s.find("you"), "U");
                s.erase(s.find("you"), 3);
            }
        }

        return s;
    }
};

다시 짜본 소스
class SMSLanguage
{
public:

    string translate(string t)
    {   
        string s;
        REP(i, t.size())
            if( t[i] != '.' && t[i] != ',' && t[i] != '?' && t[i] != '!')
                s += t[i];
        REP(i, s.size()) s[i] = tolower(s[i]);

        int p = 0;
        while( s.find("and") != string::npos)
            s.replace(s.find("and"), 3, "&");

        while( s.find("ate") != string::npos)
            s.replace(s.find("ate"), 3, "8");

        while( s.find("at") != string::npos)
            s.replace(s.find("at"), 2, "@");

        while( s.find("you") != string::npos)
            s.replace(s.find("you"), 3, "U");

        return s;
    }
};

SRM357 DIV2

class MnemonicMemory
{
public:

    string getPhrase(string num, vector <string> d)
    {   
        sort(ALL(d));
        string ret;
        REP(i, num.size())
        {
            int c = num[i]-'0';
            REP(j, d.size())
            {
                if(d[j].size() == c)
                {
                    ret += d[j] + " ";
                    d[j] = "";
                    break;
                }
            }
        }
        ret.erase(ret.size()-1, 1);
        return ret;
    }
};

SRM358 DIV2

class CyclicWords
{
public:

    int differentCW(vector <string> w)
    {   
        vector<string> d;

        REP(i, w.size())
        {
            string s = w[i];
            int isok = 1;
            REP(j, s.size())
            {
                string temp = s.substr(j)+ s.substr(0, j);
                if( find(ALL(d), temp) != d.end() )
                {
                    isok = 0;
                    break;
                }
            }
            if(isok == 1) d.pb(s);
        }

        return d.size();
    }
};

SRM359 DIV2
: 1은 0으로 0은 1으로 변경을 (pos+1)%2 로 써봤는데, 그것보다 1-pos가 더 간결하다..
또는 !pos 로 쓰는 방법도 있음.


class CricketScores
{
public:

    vector <int> totalRuns(vector <int> r)
    {   
        VI ret(2,0);
        int pos = 0;
        REP(i, r.size())
        {
            ret[pos] += r[i];
            if((i+1)%6 == 0)
            {
                if(r[i] % 2 == 0)
                    pos = (pos+1)%2;
            }
            else if( r[i] % 2 == 1)
            {
                pos = (pos+1)%2;
            }
        }

        return ret;
    }
};

SRM360 DIV2
: 예제가 없었으면 오류가 날 뻔 했음. ( %로 나머지를 구해도 음수가 발생할 수 있다)

class AzimuthMonitoring
{
public:

    int getAzimuth(vector <string> ins)
    {   
        int ret = 0;

        REP(i, ins.size())
        {
            string s = ins[i];
            string t1;
            int r;
            if( s == "HALT") break;
            if( s == "LEFT") ret -= 90;
            if( s == "RIGHT") ret += 90;
            if( s == "TURN AROUND") ret += 180;
            if( s.size() > 4 && s.substr(0, 4) == "LEFT")
            {
                istringstream in(s);
                in >> t1 >> r;
                ret -= r;
            }
            if( s.size() > 5 && s.substr(0, 5) == "RIGHT")
            {
                istringstream in(s);
                in >> t1 >> r;
                ret += r;
            }
        }

        ret %= 360;
        if(ret < 0) ret+= 360;

        return ret;
    }
};

반응형