Software

(프로그래머스 c++ KAKAO)방금 그 곡 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)방금 그 곡

favorcom 2020. 6. 5. 10:21
728x90
반응형

조건이 까다로운 문제였다...

 

우선 문자열에서 #이 붙은 음을 다른 문자로 치환을 하여야 한다.

이 부분이 첫번째 난관이다.

본인은 맵을 이용하여 다른 문자로 치환하였다.

C#, D#, F#, G#, A#을 겹치지 않은 문자로 맵에 넣어주었다.

그리고 change() 함수를 따로 정의해서 musicinfos에 들어있는 멜로디와 m의 문자열을 #을 없앤 문자로 바꿔주었다.

change함수는 별로 어렵지 않으니 쉽게 따라갈 수 있을 것이다..!

 

이제 musicinfos를 분해해야 한다..!

우선 시간을 나눠야 한다.

bHour = 재생 시작된 시, bMin = 재생 시작된 분,

aHour = 재생 끝난 시, bMin = 재생 끝난 분,

time = 재생된 시간(분), bTime = 이전 곡의 재생된 시간(분) 이다.

시간은 정해진 위치에 각각 있으므로 substr을 이용하여 bHour, bMin, aHour, aMin에 int형으로 변환하여 넣어준다.

 

title = 현재 음악의 제목, tmp = 현재 음악의 멜로디를 저장할 변수다.

musicinfos의 12번째 인덱스부터 제목이 시작되는 부분이므로 ','가 나오면 제목과 멜로디를 각각의 변수에 넣어주도록 한다.

그리고 tmp에 들어있는 #을 다른 문자로 치환하기 위하여 다시 change() 함수를 호출하고, 치환된 멜로디를 music 변수에 넣어준다.

 

이제 music의 크기를 time과 비교하도록 한다.

만약 music.size() < time 이면 재생된 시간만큼 music의 멜로디를 이어 붙여야 한다.

for문을 이용하여 music을 time만큼 이어준다.

 

music.size() >= time 이면 재생된 시간만큼 잘라줘야 한다.

(이 부분에서 실패가 떴다..! 왜냐하면 재생된 시간보다 긴 멜로디가 들어올 수 있고, 이로 인해 답이 달라질 수 있기 때문에 멜로디를 잘라줘야 한다..!)

 

마지막으로 string의 find를 이용하여 적절한 제목을 찾으면 된다...!

다만

/조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다./

이 조건에 해당하는 답을 찾아야 하므로

이전 곡의 재생 시간과 현재 곡의 재생 시간을 비교하여 answer에 넣어주면 된다..!

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

using namespace std;

string change(string &in, map<string, char> &s)
{
    string out = "";
    
    for(int i = 0; i < in.size(); i++)
    {
        if(in[i + 1] == '#')
        {
            out += s[in.substr(i, 2)];
            i++;
        }
         else
            out += in[i];
    }
    return out;
}
string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int bHour = 0, aHour = 0, bMin = 0, aMin = 0, time = 0, bTime = 0;
    string melody = "", title = "";
    map<string, char> s;
    
    s["C#"] = 'Q';
    s["D#"] = 'W';
    s["F#"] = 'R';
    s["G#"] = 'T';
    s["A#"] = 'Y';
    
    melody = change(m, s);
    
    for(int i = 0; i < musicinfos.size(); i++)
    {
        string tmp = "", music = "";
        
        bHour = stoi(musicinfos[i].substr(0, 2)) * 60;
        bMin = stoi(musicinfos[i].substr(3, 2));
        aHour = stoi(musicinfos[i].substr(6, 2)) * 60;
        aMin = stoi(musicinfos[i].substr(9, 2));
        time = (aHour + aMin) - (bHour + bMin);
        
        //Divide title and Melody from musicinfos
        //tmp == melody
        for(int j = 12; musicinfos[i].size(); j++)
        {
            if(musicinfos[i][j] == ',')
            {
                title = musicinfos[i].substr(12, j - 12);
                tmp = musicinfos[i].substr(j + 1);
                break;
            }
        }
        
        music = change(tmp, s);

        if(music.size() < time)
        {
            tmp = music;
        
            for(int j = 1; j < time / tmp.size(); j++)
                music += tmp;
            for(int j = 0; j < time % tmp.size(); j++)
                music += tmp[j];
        }
        else
            music = music.substr(0, time);
        
        if(music.find(melody) != string::npos)
        {
            if(bTime < time)
            {
                answer = title;
                bTime = time;
            }
        }
    }
    return answer;
}
728x90
반응형