반응형
해결 방법
이 문제의 핵심은 치환이다.
치환 방법을 사용하지 않는다면 많은 소스 코드가 필요할 것이다. 왜냐하면, 하나의 음이 하나의 문자열을 차지해야 string 라이브러리를 편리하게 사용할 수 있기 때문이다.
A#, C#, D#, F#, G#도 하나의 음이기 때문에 이를 각각 a, c, d, f, g로 치환해서 해결하면 된다.
각 함수의 용도는 주석으로 표시했다.
소스 코드
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
// 음악의 순번, 시작 시간, 끝 시간, 이름, 악보, 재생시간을 담은 구조체
struct music {
int id;
string start;
string end;
string name;
string sheet;
int length;
};
// 음악의 재생 시간을 반환
int get_length(string s, string e){
int si = 60*stoi(s.substr(0,2))+stoi(s.substr(3));
int ei = 60*stoi(e.substr(0,2))+stoi(e.substr(3));
return ei-si;
}
// 음악 정보가 담긴 문자열을 파싱해서 담은 구조체를 반환
music parse(int id, string s){
queue<string> q;
music m; int p=0;
for(int i=0;i<s.length();i++){
if(s[i]==','){
q.push(s.substr(p, i-p));
p=i+1;
}
if(i==s.length()-1) q.push(s.substr(p));
}
m.id=id;
m.start=q.front(); q.pop();
m.end=q.front(); q.pop();
m.name=q.front(); q.pop();
m.sheet=q.front(); q.pop();
m.length=get_length(m.start, m.end);
return m;
}
// 치환 함수
string replace_melody(string m){
int pos;
while((pos=m.find("A#"))!=-1) m.replace(m.find("A#"),2,"a");
while((pos=m.find("C#"))!=-1) m.replace(m.find("C#"),2,"c");
while((pos=m.find("D#"))!=-1) m.replace(m.find("D#"),2,"d");
while((pos=m.find("F#"))!=-1) m.replace(m.find("F#"),2,"f");
while((pos=m.find("G#"))!=-1) m.replace(m.find("G#"),2,"g");
return m;
}
// 재생시간동안의 악보를 반환
string get_all_melody(string m, int tlen){
string am="";
for(int i=0;i<tlen;i++) am+=m[i%m.length()];
return am;
}
// sort용 커스텀 함수
bool compare(music m1, music m2) {
if(m1.length==m2.length) return m1.id<m2.id;
else return m1.length>m2.length;
}
string solution(string m, vector<string> musicinfos) {
vector<music> musics;
for(int i=0;i<musicinfos.size();i++){
music mu = parse(i, musicinfos[i]);
string my_melody = replace_melody(m);
string melody = get_all_melody(replace_melody(mu.sheet), mu.length);
if(melody.find(my_melody)!=-1) musics.push_back(mu);
}
if(!musics.size()) return "(None)";
sort(musics.begin(),musics.end(),compare);
return musics[0].name;
}
테스트케이스 30개 모두 정답
반응형
'Algorithm > String' 카테고리의 다른 글
[String] 매칭 점수 - 2019 KAKAO BLIND RECRUITMENT (0) | 2022.06.07 |
---|---|
[문자열] 문자열 압축 - 2020 카카오 블라인드 채용 (0) | 2022.03.04 |
댓글