#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int what_time(string &s)
{
int start_hour = stoi(s.substr(0,2));
int start_minute = stoi(s.substr(3,2));
int end_hour = stoi(s.substr(6,2));
int end_minute = stoi(s.substr(9,2));
if (end_hour < start_hour)
end_hour += 24;
return (((end_hour - start_hour) * 60) + end_minute - start_minute);
}
typedef struct Node{
string s;
int idx;
int play_time;
}node;
string music_total_and_key_parsing(string &s, int time, string &music_key, string &music_name, string &m)
{
int cnt = 0;
string answer = "";
for(int i = 0; i < s.size(); i++)
{
if (cnt == 2 && s[i] != ',')
music_name += s[i];
if (cnt == 3)
answer += s[i];
if (s[i] == ',')
cnt++;
}
// int m_size = m.size();
// int answer_size = answer.size();
music_key = answer;
answer = "";
for(int i = 0; i < time; i++)
{
if (i > music_key.size() - 1)
{ if( music_key[i % music_key.size() ]== '#')
time++;
answer += music_key[i % music_key.size() ];
}
else
{
if(music_key[i] == '#')
time++;
answer += music_key[i];
}
}
return answer;
}
bool cmp (node* a, node * b)
{
if (a->play_time == b->play_time)
return a->idx > b->idx;
return a->play_time < b->play_time;
}
string solution(string m, vector<string> musicinfos) {
string answer = "";
vector<node*> v;
for(int i = 0; i < musicinfos.size(); i++)
{
// cout << what_time(musicinfos[i] ) << " " << endl;
int play_time = what_time(musicinfos[i] ); // 실행시간
string music_key = "";
string music_name = "";
string total_music = music_total_and_key_parsing(musicinfos[i], play_time, music_key, music_name, m); //총시간, 키, 이름 파싱
string temp = "";
for(int j = 0; j < m.size(); j++)
{
if (m[j] == '#')
temp.back() += 32;
else
temp += m[j];
}
m = temp;
temp = "";
for(int j = 0; j < total_music.size(); j++)
{ if (total_music[j] == '#')
temp.back() += 32;
else
temp += total_music[j];
}
total_music = temp;
//cout << total_music << endl;
if (total_music.find(m) != string::npos) { // 키가 일치하면
node* nnode = new node;
nnode->s = music_name;
nnode->play_time = play_time;
nnode->idx = i;
v.push_back(nnode); // 벡터에 넣어논다.
}
}
sort(v.begin(), v.end(), cmp);
if (v.size() == 0)
return "(None)";
return v.back()->s;
}
구현방법
string에서 ,를 기준으로 계속 파싱한다.
파싱한 시간으로 플레이 타임을 구한다.
플레이 타임만큼 재생된 노래 전체 구간을 구한다.
문자 뒤에 #이 붙을경우 이를 구분하기 위해 소문자로 바꿔준다.
find함수를 이용해서 들은 멜로디와 전체 노래 구간을 비교해서
벡터에 넣는다.
벡터는 인덱스, 플레이타임, 제목으로 이루어진 노드이다.
인덱스, 플레이타임을 기준으로 소트를 한다.
유의해야 할점
#이 붙을경우를 유의하자 (string size)
플레이 타임이 같을경우 idx순으로 리턴하는점을 유의하자