4번 문제는 다소 복잡한 구현 난이도를 가지고 있습니다. 음계에 #이 붙은 경우를 처리해 주어야 하고, 주어진 시간동안 해당 음계가 반복하며 재생된다는 점을 참고하여 실제 재생된 구간의 길이를 구해야 하고, 어찌어찌 찾게 되면 또 조건에 맞는 대상을 찾아 최종적으로 1개를 리턴해 주어야 하는.. 복잡 of 복잡 문제라고 볼 수 있습니다.
C++의 경우 split을 직접적으로 해주는 함수가 없어 더욱 구현 난이도가 올라갈 것 같습니다. 여기서는 다소 간단한 방법으로 split 함수를 구현하여 사용해 보았습니다. 쉼표를 기준으로 split, :를 기준으로 시간 split 하여 이를 객체화하고, 조건에 맞는 순서대로 정렬하여 그 순서대로 찾으면 됩니다. 구현 난이도에 있어 쉽지 않음을 알 수 있습니다.
vector<string> split(string str, char delim)
{
vector<string> ret;
int lidx = 0, ridx=0, len = 0;
for (char c : str)
{
if (c == delim)
{
ret.push_back(str.substr(lidx, len));
ridx++; lidx = ridx; len = 0;
continue;
}
ridx++;
len++;
}
ret.push_back(str.substr(lidx, len));
return ret;
}
class Node
{
public:
vector<string> arr;
int no, st, ed;
string music;
bool operator < (const Node &n) const
{
return (ed - st) == (n.ed - n.st) ? no < n.no : (ed - st) < (n.ed - n.st);
}
};
string solve(string m, vector<string> musicinfos)
{
vector<Node> vn(musicinfos.size());
int i = 0;
for (auto musicinfo : musicinfos)
{
vn[i].no = i;
vn[i].arr = split(musicinfo, ',');
auto ststr = split(vn[i].arr[0], ':'), edstr = split(vn[i].arr[1], ':');
vn[i].st = stoi(ststr[0]) * 100 + stoi(ststr[1]),
vn[i].ed = stoi(edstr[0]) * 100 + stoi(edstr[1]);
i++;
}
sort(vn.begin(), vn.end());
for (auto it : vn)
{
string cmp = "";
for (int i = 0; it.st < it.ed; i = (i + 1) % it.arr[3].length(), it.st++)
{
if (it.arr[3][i] == '#') it.st--;
cmp += it.arr[3][i];
}
if (cmp.find(m) != string::npos) return it.arr[2];
}
}