Problem Solving/Topcoder

[Topcoder] SRM424 DIV2

끄적끄적 2008. 11. 7. 16:55

어제 저녁 9시에 있었던 매치다. 집에서 하면 애들때문에 제대로 못할 거 같아서 회사에 남아서 했다.
간만에 500점 문제가 비교적 쉬웠던거 같고, 900문제도 그리 어렵지 않은거 같아 풀었는데 900문제는 문제이해를 잘 못해서 system fail됐다.

500문제를 challenge time에 두명 걸어봤는데, 둘다 실패났다.
9부터 나누어지는 수를 계산하면 되는 문제인데, 정말 엉뚱하게 소스가 빙빙 둘려졌길래..분명히 틀릴 거야 하고 챌린지를 했건만.. 실패라나 ㅎㅎ;
역시 챌린지는 확실할 때만 해야 될 듯하고, 다른 사람 소스를 파악하는 연습을 많이 해야 겠다는 것을 느꼈다.
rating은 1점의 변경도 없이 그대로 고정이다;

250pt.
주어진 스트링에서 A, Z가 들어간 부분만 뒤집고, 다른 char는 원래 자리를 그대로 유지시켜 주는 encrypt 를 구현하는 문제.

    string fixTheSpell(string s)
    {
        string s1;
        vector< pair<int, char> > p;
        REP(i, s.size())
        {
            if( s[i] != 'A' && s[i] != 'Z') p.pb(make_pair(i, s[i]));
            else s1 += s[i];
        }
        reverse(ALL(s1));
        REP(i, p.size())
        {
            s1 = s1.substr(0, p[i].first) + p[i].second + s1.substr(p[i].first);
        }

        return s1;
    }   


500pt.
주어진 수 N이 숫자 X의 각 자리값들의 곱으로 나타내 진다고 했을때, X가 될 수 있는 최소값을 구하는 문제.
9부터 2까지 나누어질 수 있는 수만큼 나눠주면서 개수를 세면 된다.

class ProductOfDigits
{
public:
     
    int smallestNumber(int N)
    {
        vector<int> d(8, 0);

        if(N == 1) return 1;
        for(int i = 9; i>= 2; i--)
        {
            int pos = 9 - i;
            int cnt = 0;

            while( N % i == 0 )
            {
                cnt++;
                N /= i;
            }
            d[pos] = cnt;
        }

        if( N != 1 ) return -1;

        int ret = 0;
        REP(i, d.size()) ret += d[i];
        return ret;
    }   
};
반응형