티스토리 뷰

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <map>

using namespace std;

string change(string in) {
    string out = "";
    
    map<string, char> m = {
        {"A#", 'H'}, {"B#", 'I'}, {"C#", 'J'}, {"D#", 'K'}, {"E#", 'L'}, {"F#", 'M'}
    };
    
    //#을 대응되는 문자로 변환
    for (int i = 0; i < in.size(); i++) {
        if (i + 1 < in.size() && in[i + 1] == '#') {
            string tmp = in.substr(i, 2); 
            out += m[tmp]; 
            i++; // #을 건너뛰기
        } 
        else out += in[i]; // 일반 문자 그대로 추가
    }
    
    return out;
}

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int time = 0;

    //변환
    m = change(m);

    for (int i = 0; i < musicinfos.size(); i++) {
        stringstream ss(musicinfos[i]);
        vector<string> parts;
        string part;

        while (getline(ss, part, ',')) parts.push_back(part);

        // 시작 시간
        int s_hour = 60 * stoi(parts[0].substr(0, 2));
        int s_min = stoi(parts[0].substr(3, 2));

        // 종료 시간
        int e_hour = 60 * stoi(parts[1].substr(0, 2));
        int e_min = stoi(parts[1].substr(3, 2));

        // 재생 시간 계산
        int play_time = (e_hour + e_min) - (s_hour + s_min);

        if (time >= play_time) continue; // 재생 기간이 가장 긴 곡 선택

        string tmp = parts[3];
        string c_tmp = change(tmp); // 현재 곡을 변환

        // 곡의 길이가 재생 시간보다 짧으면 반복
        while (c_tmp.size() < play_time) {
            c_tmp += c_tmp;
        }
        
        // 곡 길이를 맞추기 위해 자르기
        c_tmp = c_tmp.substr(0, play_time);

        // m과 c_tmp 비교
        if (c_tmp.find(m) != string::npos) {
            answer = parts[2]; 
            time = play_time;
        }
    }

    return answer;
}

 

먼저 문자열을 쉼표를 기준으로 나누고, 여기서 얻은 시작 시간과 종료 시간 문자열을 통해 플레이된 시간을 구해준다.

그리고 #처리를 위해 따로 map을 통해 아래와 같이 매핑을 해주었다.

 {"A#", 'H'}, {"B#", 'I'}, {"C#", 'J'}, {"D#", 'K'}, {"E#", 'L'}, {"F#", 'M'}

 

따라서 #이 붙은 문자는 위와 같이 다른 문자로 변환을 해준다.

이는 입력 m과 musicinfos에서 슬라이싱한 문자열 모두 해준다.

 

그러고나서 해당 곡의 길이를 체크하여 재생 시간보다 짧다면 반복하여 더해준다.

반복하여 더해주면 곡의 길이가 또 너무 길어질 수 있는데, 플레이 시간에 맞춰 다시 잘라주는 작업을 해준다.

이제 변환된 악보에서 변환된 멜로디가 존재하는지 체크하여 있다면 곡을 담아준다.

이때 플레이 타임도 같이 저장해주는데, 여기서 저장한 변수 time은 재생 기간이 가장 긴 곡을 선택하는데 사용된다.

 

코드를 보면 재생 시간 계산 후에 if문이 있는데, 여기서 저장된 time이 플레이된 시간보다 크거나 같다면 이미 재생 기간이 길기에 굳이 다른 곡을 찾을 필요가 없다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함