본문 바로가기
  • 실행력이 모든걸 결정한다
Algorithm/String

[문자열] 방금그곡 - 2018 카카오 블라인드 채용

by 김코더 김주역 2022. 3. 15.
반응형

해결 방법

이 문제의 핵심은 치환이다.

치환 방법을 사용하지 않는다면 많은 소스 코드가 필요할 것이다. 왜냐하면, 하나의 음이 하나의 문자열을 차지해야 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개 모두 정답

반응형

댓글