구현
먼저 문자열의 내의 #
음표들을 소문자로 대체시켰다. 이로써 문자열 길이가 실제 음악의 총 시간이다. 단 replaceAll()
함수가 존재하지 않기 때문에, find를 활용하여 구현해줬다.
split 함수를 구현해줬다. split은 ,
을 분할해주는 것과, 시간의 :
을 나눠 벡터로 반환하는 역할을 한다.
재생되는 시간은 (종료시간의 시 *60 + 종료시간의 분) - (시작시간의 시*60 + 시작시간의 분)
이다.
재생되는 시간동안에 나오는 총음표를 출력한다. 실제 음악의 총 시간보다 더 길게 재생할 수도 아닐 수도 있다. 이를 모두 아우르는 식은 나머지 연산을 함께 활용하면 구할 수 있다.
answer 를 pair 처리 하여 제목과 시간을 넣어주자. 초기화 값은 (None)
과 이다. 정답은 재생길이가 가장 긴 음악 중에서 맨 처음 나온 음악 제목을 넣는 것 이므로, 조건을 만족하면서도 현재 재생되는 시간과 비교하여 더 큰 값만 answer에 반영될 수 있도록 한다.
#include <string>
#include <vector>
using namespace std;
vector<string> v;
vector<string> st, ed;
vector<string> split(string str, char deli) {
int idx = 0;
vector<string> temp;
string curr = "";
while(idx < str.size()) {
if(str[idx]==deli) {
temp.push_back(curr);
curr = "";
} else {
curr += str[idx];
}
idx++;
}
temp.push_back(curr);
return temp;
}
void replaceAll(string &m, string from, string to) {
int idx = 0;
while((idx=m.find(from))!= -1) {
m.replace(idx, from.length(), to);
}
}
void change(string &str) {
replaceAll(str,"A#", "a");
replaceAll(str,"C#", "c");
replaceAll(str,"D#", "d");
replaceAll(str,"F#", "f");
replaceAll(str,"G#", "g");
}
string solution(string m, vector<string> musicinfos) {
change(m);
pair<string, int> answer = {"(None)", 0};
for(int i=0; i<musicinfos.size(); i++) {
v = split(musicinfos[i], ',');
st = split(v[0], ':');
ed = split(v[1], ':');
change(v[3]);
// 재생시간
int curr_time = (stoi(ed[0])*60+stoi(ed[1])) - (stoi(st[0])*60+stoi(st[1]));
// 현재음악길이
string curr_str = "";
int idx = 0;
while(idx<curr_time) {
curr_str+=v[3][idx++%v[3].size()];
}
if(curr_str.find(m) != string::npos) {
if(answer.second < curr_time) {
answer.first = v[2];
answer.second = curr_time;
}
}
}
return answer.first;
}