알고리즘/프로그래머스 2단계

프로그래머스 - [3차] 방금그곡 - C++

게임만드는학생 2024. 8. 16. 13:41

https://school.programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

void convertSharp(string &s)
{
    string ss="";
    
    for(int i=0;i<s.length();i++)
    {
        if(i<s.length()-1 && s[i+1]=='#')
        {
            ss+=s[i]+32;i++;
        }
        else
            ss+=s[i];
    }
    s=ss;
}

string conS(string& s)
{
    string c = "";
    int i = 0;
    for (i = 0; i < s.length(); i++)
    {
        if (s[i] == ',')break;
        else c += s[i];
    }
    if (i < s.length())
        s = s.substr(i + 1);
    return c;
}

string solution(string m, vector<string> musicinfos) {
    string answer = "";
    convertSharp(m);
    int longestTime =-1;
    for (string s : musicinfos)
    {
        string startT, endT;
        string title = "", song = "";
        
        startT = (conS(s));
        endT = (conS(s));
        title = conS(s);
        song = conS(s);
        int t = stoi(endT.substr(0, 2)) * 60 + stoi(endT.substr(3));
        t -= stoi(startT.substr(0, 2)) * 60 + stoi(startT.substr(3));
        string so = "";
        convertSharp(song);
        for (int i = 0; i < t; i++)
            so += song[i % song.length()];
        if(so.find(m)!=string::npos)
        {
            if(longestTime < t)
            {
                longestTime = t;
                answer = title;
            }
        }
    }
    if (longestTime == -1)return "(None)";

    return answer;
}

 

주어진 문자열배열을 보고 m 문자열과 일치하는지 또 일치하면 그중 조건에 맞는 것은 무엇인지를 리턴하는 문제이다. 

 

주어진 문자열 즉 곡 한곡에 대한 정보는 다음처럼 구분했다. 

string conS(string& s)
{
    string c = "";
    int i = 0;
    for (i = 0; i < s.length(); i++)
    {
        if (s[i] == ',')break;
        else c += s[i];
    }
    if (i < s.length())
        s = s.substr(i + 1);
    return c;
}




string startT, endT;
        string title = "", song = "";
        
        startT = (conS(s));
        endT = (conS(s));
        title = conS(s);
        song = conS(s);
        int t = stoi(endT.substr(0, 2)) * 60 + stoi(endT.substr(3));
        t -= stoi(startT.substr(0, 2)) * 60 + stoi(startT.substr(3));

conS 함수를 통해 , 를 기준으로 나눈 값을 리턴해주고 참조자로 받아온 main의 값에 , 뒷부분을 저장한다. 

진행시간은 t변수에 저장한다. 

 

void convertSharp(string &s)
{
    string ss="";
    
    for(int i=0;i<s.length();i++)
    {
        if(i<s.length()-1 && s[i+1]=='#')
        {
            ss+=s[i]+32;i++;
        }
        else
            ss+=s[i];
    }
    s=ss;
}

위의 함수는 이 문제를 풀기위한 핵심함수이다. 

문자열에서 #을 어떻게 처리할지가 가장 시간이 오래 소모되었다. 

C# 같은 경우 소문자 c로 처리하면 아주 간단하게 문제를 바꿀 수 있다. 

따라서 이 함수로 미리 # 을 소문자로 처리한다. 

 

convertSharp(song);
        for (int i = 0; i < t; i++)
            so += song[i % song.length()];
        if(so.find(m)!=string::npos)
        {
            if(longestTime < t)
            {
                longestTime = t;
                answer = title;
            }
        }

그 후, so 문자열에  전체 진행된 악보를 만들어 저장하고 

거기서 찾고자 하는 문자열 m 이 있는지 확인 후 저장한다. 

조건이 가장 오래 진행된 악보이며 진행시간이 동일하다면 앞에 나온 것을 고르는 것이다. 

따라서 가장 긴 거보다 더 길면 바꾼다.