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;
}
};