알고리즘/프로그래머스 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 이 있는지 확인 후 저장한다.
조건이 가장 오래 진행된 악보이며 진행시간이 동일하다면 앞에 나온 것을 고르는 것이다.
따라서 가장 긴 거보다 더 길면 바꾼다.