Problem Solving

[Topcoder] SRM173 ~ 180연습

끄적끄적 2008. 9. 4. 10:28

SRM173 DIV2
: 코딩속도를 높이기 위해서 REP 를 define하고 쓰는 연습을 해봤다.

#define REP(I,N) for(int I=0;I<(N);I++)

class ProgressBar
{
public:
 string showProgress(vector <int> t, int c)
 {  
  int tot = 0, cur = 0;
  REP(i,t.size()) tot += t[i];
  REP(i,c) cur += t[i];

  int doing = 20.0 * cur  / tot;
  string ret(20, '.');
  REP(i,doing) ret[i] = '#';
  return ret;
 }
};

SRM174 DIV2
평이한 문제

class CrossWord
{
public:
 int countWords(vector <string> b, int s)
 {  
  int ret = 0;

  REP(i, b.size())
  {
   int cnt = 0;
   string val = b[i];

   REP(j, val.size())
   {
    if(val[j] == '.')
    {
     cnt++;
    }
    else
    {
     if( cnt == s) ret++;
     cnt = 0;
    }
   }
   if( cnt == s) ret++;
  }
  return ret;
 }
};

SRM175 DIV2
: 8분이내로 시간단축 성공

class ClockWalk
{
public:
 int finalPosition(string f)
 {  
  int ret = 0;
 
  REP(i, f.size())
  {
   if(f[i] == 'h') ret += (i+1);
   else ret -= (i+1);
  }
 
  ret = ret % 12;
  if(ret <= 0 ) ret += 12;

  return ret;
 }
};

SRM176 DIV2
: 문제파악이 오래걸린 문제..
전에도 한번 느꼈는데.. 아래 128을 더하거나 빼주는 부분을
( rgb[i]+128 ) % 256 으로 구현할 수 있는 사고의 전환이 필요.

class RGBColor
{
public:
 vector <int> getComplement(vector <int> rgb)
 {  
  VI ret;

  int r = 255 - rgb[0];
  int g = 255 - rgb[1];
  int b = 255 - rgb[2];

  if( abs(rgb[0] - r) > 32 ||  abs(rgb[1] - g) > 32 || abs(rgb[2] - b) > 32 )
  {
   ret.pb(r);
   ret.pb(g);
   ret.pb(b);
  }
  else
  {
   REP(i,3)
   {
    if(rgb[i] - 128 >= 0) ret.pb(rgb[i] - 128);
    else ret.pb( rgb[i]+128 );
   }
  }
  return ret;
 }
};

SRM177 DIV2
: 다른사람들 경우 이중 for문을 돌렸으나, 나는 o(n)이니 좀더 나은건가..ㅎㅎ;

class Stairs
{
public:
 int designs(int m1, int m2, int h, int w)
 {  
  int ret = 0;
  int r = 0, t = 0;
  for(int i=1; i<= max(h,w); i++)
  {
   if((h % (i+1)) != 0 || (w % i != 0)) continue;
   r = h / (i+1);
   t = w / i;
   if( r <= m1 && t >= m2) ret++;
  }
  return ret;
 }
};

SRM178 DIV2
: 4분만에 푼 문제... 문제도 워낙 간단하고, stringstream을 이용하면 간단한 문제.

class SimpleCalculator
{
public:
 int calculate(string input)
 {  
  int a, b;
  char c;
  stringstream in(input);
  in >> a >> c >> b;

  if( c == '+') return a+b;
  else if(c == '-')return a-b;
  else if(c == '*') return a*b;
  else return a/b;
 }
};

SRM179 DIV2
: 두번째 for문을 for(int j= max(i-k, 0); j<i; ++j) 로 짜는게 더 가독성이 높다.

class OnLineRank
{
public:
 int calcRanks(int k, vector <int> s)
 {  
  int ret = 0, cur = 0, rank = 0, cnt = 0;
  REP(i, s.size())
  {
   cur = s[i];
   rank = 1;
   cnt = 0;
   for(int j=i-1; j>=0 ; j--)
   {
    if(cnt++ == k) break;
    if( s[j] > cur) rank++;
   }
   ret += rank;
  }
  return ret;
 }
};

SRM180 DIV2
: 심플한 문제..

class DinkyFish
{
public:
 int monthsUntilCrowded(int t, int m, int f)
 {  
  int ret = 0, born = 0;
  while( 2*t >= m+f )
  {
   born = min(m, f);
   m += born;
   f += born;
   ret ++;
  }
  return ret;
 }
};

반응형