[풀이 - Cut the sticks]
더보기
int GetLengthOfCut(vector<int> arr)
{
int result = INT_MAX;
//
for(int i = 0; i < arr.size(); ++i)
{
if(arr[i] < result)
result = arr[i];
}
//
return result;
}
vector<int> cutTheSticks(vector<int> arr)
{
vector<int> result;
while(true)
{
int sticksCut = arr.size();
//
if(sticksCut == 0)
break;
else
result.push_back(sticksCut);
//
int lengthOfCut = GetLengthOfCut(arr);
//
auto iter = arr.begin();
for(; iter != arr.end(); )
{
*iter -= lengthOfCut;
if(*iter <= 0)
arr.erase(iter);
else
++iter;
}
}
return result;
}
[풀이 - Non-Divisible Subset]
더보기
int nonDivisibleSubset(int k, vector<int> s)
{
int result = 0;
int count = s.size();
map<int, int> m;
// convert array to map of remain
for(int i = 0; i < count; ++i)
{
int remain = s[i] % k;
m[remain]++;
}
//
for(int i = 1; i <= (k/2); ++i)
{
if(i != k-i) // case1: many of remain : (1 > k-1), (2 < k-2) ...
result += max(m[i], m[k-i]);
else // case2: remain == k/2
{
if(m[i] > 0)
result++;
}
}
// case3: remain == 0
if(m[0] > 0)
result++;
//
return result;
}
1. (a + b) % x 가 '0'인 경우 (a % x) + (b % x) 또한 '0'이다.
2. 두 숫자의 합이 x의 배수가 되지 않게 하려면 두 숫자의 나머지의 합이 x가 아니어야 한다.
ex) (1, x-1), (2, x-2)와 같은 조합이 아닐 것.
3. 배열의 부분 집합 중 임의의 2개의 원소의 합이 x의 배수가 되지 않는
부분집합의 수를 최대로 하기 위해 나머지가 i인 원소와 x-i인 원소의 갯수를 비교하여, 큰 것을 담는다.
[풀이 - Equalize the Array]
더보기
int equalizeArray(vector<int> arr)
{
int result = 0;
// Set Array To Map
map<int, int> m;
for(int i = 0; i < arr.size(); ++i)
m[arr[i]]++;
// Find Max (Key & Value)
pair<int, int> max;
auto iter = m.begin(), end = m.end();
for(; iter != end; ++iter)
{
if(iter->second > max.second)
{
max.second = iter->second;
max.first = iter->first;
}
}
// Sum Values except Max
iter = m.begin();
for(; iter != end; ++iter)
{
if(iter->first != max.first)
result += iter->second;
}
//
return result;
}
[풀이 - Queen's Attack II]
더보기
const int dirCount = 8;
//
int queensAttack(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles)
{
int dist[dirCount];
// cross dirs left To Clockwise
dist[0] = c_q - 1;
dist[1] = n - r_q;
dist[2] = n - c_q;
dist[3] = r_q - 1;
// diagonal dirs LU To ClockWise
dist[4] = min(dist[0],dist[1]);
dist[5] = min(dist[1],dist[2]);
dist[6] = min(dist[2],dist[3]);
dist[7] = min(dist[3],dist[0]);
//
int x, y;
for(int i = 0; i < k; ++i)
{
y = obstacles[i][0] - r_q;
x = obstacles[i][1] - c_q;
if(x == 0)
{
if(y > 0)
dist[1] = min(dist[1], +(y-1));
else
dist[3] = min(dist[3], -(y+1));
}
else if(y == 0)
{
if(x > 0)
dist[2] = min(dist[2], +(x-1));
else
dist[0] = min(dist[0], -(x+1));
}
else
{
float m = (float)y / (float)x;
if(m == 1.0)
{
if(x > 0)
dist[5] = min(dist[5], +(x-1));
else
dist[7] = min(dist[7], -(y+1));
}
else if(m == -1.0)
{
if(x > 0)
dist[6] = min(dist[6], +(x-1));
else
dist[4] = min(dist[4], +(y-1));
}
else
continue;
}
}
//
int result = 0;
for(int i = 0; i < dirCount; i++)
result += dist[i];
//
return result;
}