Problem Solving

[Topcoder] SRM278 ~ 282 연습

끄적끄적 2008. 9. 18. 09:46
SRM278 DIV2
: 300점짜리라 그런가 다른문제보다 많이 까다로웠다; 문제 이해를 잘못해서 좀 헤맸음..
map을 안쓰고, 그냥 26개로 된 배열을 써도 되는 문제. 
배열내에 가장 큰 첫번째 위치는 max_element(begin, end)

class RectangleGroups
{
public:

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

string maximalIndexed(vector <string> r)
{
map<char, int> m;

REP(i, r.size())
{
stringstream in(r[i]);
char c;
int a, b;
in >> c >> a >> b;
m[c] += a*b;
}

int max_i = 0;
for(map<char,int>::iterator pos = m.begin(); pos != m.end(); pos++)
max_i = max(max_i, pos->second);

string ret;
int val = 0;
for(map<char,int>::iterator pos = m.begin(); pos != m.end(); pos++)
if (max_i == pos->second)
{
ret = pos->first;
val = pos->second;
break;
}
ret += ' '+ toStr(val);
return ret;
}
};

SRM279 DIV2
: 같은 300점짜리인데 이 문제는 쉽네;

class DancingSentence
{
public:

string makeDancing(string s)
{
string ret;

int upper = 1;
REP(i, s.size())
{
if( upper == 1 && s[i] != ' ')
{
ret += toupper(s[i]);
upper = 0;
}
else if( upper == 0 && s[i] != ' ')
{
ret += tolower(s[i]);
upper = 1;
}
else
ret += s[i];
}

return ret;
}
};

SRM280 DIV2
: 중복된게 있는지 확인하는 방법으로 
한자리씩 set<int>, vector<int>에 넣은 후 size가 같은지 비교하는 방법이 있다.

class UniqueDigits
{
public:

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

int count(int n)
{
int ret = 0;
for(int i=1;i< n; i++)
{
string s = toStr(i);
int ok = 1;
REP(j, s.size())
if(std::count(ALL(s), s[j]) > 1)
{
ok = 0;
break;
}
if(ok == 1) ret++;
}
return ret;

}
};

SRM281 DIV2
: 괜찮은 문제. 다음에 다시 풀어볼 것

class RunLengthEncoding
{
public:

int toInt(string s)
{
stringstream s1(s);
int t;
s1 >> t;
return t;
}

string decode(string t)
{
string ret;
string sub;
for(int i=0; i<t.size(); i++)
{
if( isdigit(t[i]) ) sub += t[i];
else
{
if( i == 0 || (isalpha(t[i-1]) && isalpha(t[i])))
ret += string(1, t[i]);
else
ret += string(toInt(sub), t[i]);

sub = "";
}

if(sub.size() > 2)
return "TOO LONG";
}
if(ret.size() > 50) return "TOO LONG";
return ret;
}
};

SRM282 DIV2

class FixTheAverage
{
public:

double add(vector <double> l, double t)
{
double sum = 0;
REP(i, l.size())
sum += l[i];

int n = l.size() + 1;
double ret = t * n - sum;
return ret;
}
};

반응형