Programmers : 방금그곡

·2023년 5월 5일
0

알고리즘 문제 풀이

목록 보기
127/165
post-thumbnail

풀이요약

구현

풀이상세

  1. 먼저 문자열의 내의 # 음표들을 소문자로 대체시켰다. 이로써 문자열 길이가 실제 음악의 총 시간이다. 단 replaceAll() 함수가 존재하지 않기 때문에, find를 활용하여 구현해줬다.

  2. split 함수를 구현해줬다. split은 , 을 분할해주는 것과, 시간의 : 을 나눠 벡터로 반환하는 역할을 한다.

  3. 재생되는 시간은 (종료시간의 시 *60 + 종료시간의 분) - (시작시간의 시*60 + 시작시간의 분) 이다.

  4. 재생되는 시간동안에 나오는 총음표를 출력한다. 실제 음악의 총 시간보다 더 길게 재생할 수도 아닐 수도 있다. 이를 모두 아우르는 식은 나머지 연산을 함께 활용하면 구할 수 있다.

  5. answer 를 pair 처리 하여 제목과 시간을 넣어주자. 초기화 값은 (None)00 이다. 정답은 재생길이가 가장 긴 음악 중에서 맨 처음 나온 음악 제목을 넣는 것 이므로, 조건을 만족하면서도 현재 재생되는 시간과 비교하여 더 큰 값만 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;
}
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글