Problem Solving

[Topcoder] SRM165 ~ 172연습

끄적끄적 2008. 9. 3. 09:48

SRM165 DIV2
: 쉬운 문제..

class BritishCoins
{
public:
 vector <int> coins(int pence)
 {
  vector<int> ret;
  int pound = pence / 240;
  int s = (pence - pound*240) / 12;
  int p = pence % 12;

  ret.pb(pound);
  ret.pb(s);
  ret.pb(p);
  return ret;
 }
};

SRM166 DIV2
: easy문제치고는 괜찮은 문제인듯.
i, j, k에 대해 p[i] + p[j] > p[k]만 비교하면 되는데, 3가지 다 계산을 해줬다.
좀더 short code로 짤 수 있도록 사고의 연습이 필요함.

class Workshop
{
public:

 int pictureFrames(vector <int> p)
 {
  int ret = 0;
  int n = p.size();

  if(n < 3) return 0;
  int a, b, c;
  sort(p.begin(), p.end());

  for(int i=0; i< n-2; i++)
  {
   a = p[i];
   for(int j=i+1 ; j<n-1; j++)
   {
    b = p[j];
    for(int k=j+1; k< n; k++)
    {
     c = p[k];
     if(a+b > c && a+c > b && b+c > a)
     {
      ret ++;
     }
    }
   }
  }
  return ret;
 }
};

SRM167 DIV2
: 문제파악하는데 거의 10분정도 쓴 듯하다.. 실제 코딩은 3분정도..

class EyeDrops
{
public:

 double closest(int s, int k)
 {  
  if( ((double)24 / k) > s)
   return (double)24/k*60;
  return (double)(24 - s) / (k-1) * 60;
 }
};

SRM168 DIV2
: 문제에서 fllight마다 2번씩 쉬어야 한다는 내용이 없어서, 예제보면서 좀 애매했던 문제..
나누어 떨어질때와 아닐때를 나누지 않고 (f[i]-1)/s+1로 생각할 수 있으면 좋을듯.

class StairClimb
{
public:
 int stridesTaken(vector <int> f, int s)
 {  
  int ret = 0;
  int n = f.size();
  for(int i=0; i < n; i++)
  {
   if((f[i] % s) == 0) ret += f[i] / s;
   else ret += f[i] / s + 1;
  }
  ret += (n-1) * 2;

  return ret;
 }
};

SRM169 DIV2
: 비교적 쉬운 문제. 거리가 0일때에 대한 예가 없었다면 -1을 리턴해서 실패할 뻔한 문제.
바운드값에 대한 고민의 중요성을 깨우치는 문제..

class Swimmers
{
public:

 vector <int> getSwimTimes(vector <int> d, vector <int> s, int c)
 {  
  vector<int> ret;

  int up, down;
  int n = d.size();

  for(int i=0; i< n; i++)
  {
   if(d[i] == 0)
   {
    ret.pb(0);
    continue;
   }
   up = s[i] + c;
   down = s[i] - c;
   if(up <= 0 || down <= 0)
    ret.pb(-1);
   else
    ret.pb( int((double)d[i] / up + (double)d[i] / down));
  }

  return ret;
 }
};

SRM170 DIV2

class LevelUp
{
public:

 int toNextLevel(vector <int> e, int r)
 {  
  int ret = 0;

  for(int i=0; i< e.size(); i++)
   if(e[i] > r) return e[i] - r;

  return ret;
 }
};

SRM171 DIV2
: 숫자가 한자리라고 추측하는바람에 system fail난 문제. 항상 제약조건을 확인하자.
 string을 delim으로 나누는 걸 몰라서, 시간이 좀 걸렸다.(소스들을 보니 대체로 rating이 낮은 사람들이 나누는걸 어렵게 짰다)
string에서 구분값으로 나누는 함수를 미리 만들어 놓자.
  1) sscanf(d[i].c_str(), "%dd%d", &n1, &x1);
  2) char c;   stringstream s(d[i]);   s >> n1 >> c >> x1;
  3) template<typename _T, typename _S> _T cast(_S _a){ stringstream _s; _s << _a; _T _r; _s >> _r; return _r;}
      template<typename T> vector<T> split(const string& s, const string& delim=" "){vector<T> res;string t;for(int i=0; i != s.size(); i++){ if(delim.find(s[i]) != string::npos){if(!t.empty()) {res.push_back(cast<T>(t)); t = ""; }}else{ t += s[i]; }} if(!t.empty()) {res.push_back(cast<T>(t)); }return res;}
위와 같이 선언후  vector<int> temp = split<int>(d[i], "d");

class RPG
{
public:

 vector <int> dieRolls(vector <string> d)
 {  
  vector<int> ret;

  int n = d.size();
  int n1, x1;
  int min = 0, max=0;
 
  for(int i=0; i<n; i++)
  { 
   sscanf(d[i].c_str(), "%dd%d", &n1, &x1);
   min += n1;
   max += n1 * x1;
  }
  ret.pb(min);
  ret.pb(max);
  ret.pb((min + max) / 2);

  return ret;
 }
};

SRM172 DIV2
: 의외로 까다로웠던 문제.
다른사람들 소스를 보니 크게 두가지 방식을 사용했다. 익숙해 지도록 연습이 필요.
1. 비교함수를 만들어서, sort하도록 구현
2. vector< pair<int, int> > 를 만들어서 소팅. pair는 소팅할때 첫번째인자가 같으면, 두번째 인자 비교
 
내가 짠 소스 : 최소 gab 두개를 구한후 find로 원 vector에서 찾는 방식
class SkipRope
{
public:
 vector <int> partners(vector <int> c, int h)
 {
  vector<int> gab;
  for(int i=0; i<c.size(); i++)
   gab.pb( abs(c[i]-h));

  sort(all(gab));

  vector<int> ret;
  int min;
  for(int i=0; i< 2; i++)
  {
   min = gab[i];
   vector<int>::iterator it = find(c.begin(), c.end(), h+min);
   if( it != c.end())
   {
    *it = INT_MAX;
    ret.pb(h+min);
   }else
   {
    it = find(c.begin(), c.end(), h-min);
    *it = INT_MAX;
    ret.pb(h-min);
   }
  }
 
  sort(ret.begin(), ret.end());
  return ret;

 }
};


1. 정렬기준 함수를 이용한 풀이
bool comp_part(int a, int b)
{
 if( abs(a) != abs(b) ) return abs(a) < abs(b);
 return a > b;
}

class SkipRope
{
public:
 vector <int> partners(vector <int> c, int h)
 {
  for(int i=0; i< c.size(); i++)
   c[i] -= h;

  sort(ALL(c), comp_part);

  vector<int> ret;
  ret.pb(c[0]+h);
  ret.pb(c[1]+h);

  sort(ret.begin(), ret.end());
  return ret;
 }
};

2. pair를 이용한 풀이
class SkipRope
{
public:
 vector <int> partners(vector <int> c, int h)
 {  
  vector< pair<int, int> > dif;

  for(int i=0; i< c.size(); i++)  
   dif.pb( make_pair( abs(c[i] -h), -c[i]) );
 
  sort(ALL(dif));

  vector<int> ret;
  ret.pb( -dif[0].second);
  ret.pb(-dif[1].second);

  sort(ret.begin(), ret.end());
  return ret;
 }
};

반응형