오늘은 프로그래머스 문제를 푸는 도중에 처음 써본 라이브러리 함수를 정리해보려고 한다.
c++
의 string
클래스의 멤버함수 find()
이다.
string
내에서 매개변수로 넘어온 문자열을 포함하는지 검사하고, 포함한다면 찾는 문자열의 첫 인덱스
를 반환한다. 그렇지 않다면 string
형의 쓰레기값인 string::npos
를 반환한다.
#include <vector>
#include <sstream>
#include <unordered_map>
#include <iostream>
using namespace std;
string convert(string sheet)
{
unordered_map<string, char> dict = { {"C", 'a'}, {"C#", 'b'}, {"D", 'c'}, {"D#", 'd'}, {"E", 'e'}, {"F", 'f'}, {"F#", 'g'}, {"G", 'h'}, {"G#", 'i'}, {"A", 'j'}, {"A#", 'k'}, {"B", 'l'} };
string res;
for (int i = 0; i < sheet.size(); i++)
{
string s = "";
s.push_back(sheet[i]);
if (i + 1 < sheet.size())
{
if (sheet[i + 1] == '#')
{
s.push_back('#');
i++;
}
}
res.push_back(dict[s]);
}
return res;
}
string solution(string m, vector<string> musicinfos)
{
string answer = "(None)";
string m2 = convert(m);
int maxTime = 0;
for (auto e : musicinfos)
{
int time;
string title;
string tempSheet;
istringstream ss(e);
getline(ss, title, ',');
time = -(stoi(title.substr(0, 2)) * 60 + stoi(title.substr(3, 2)));
getline(ss, title, ',');
time += stoi(title.substr(0, 2)) * 60 + stoi(title.substr(3, 2));
getline(ss, title, ',');
getline(ss, tempSheet, ',');
string sheet = convert(tempSheet);
int time2 = time - sheet.size() + 1;
int idx = 0;
int n = sheet.size();
while (time2 > 0)
{
sheet.push_back(sheet[idx]);
time2--;
if (idx == n - 1)
idx = 0;
else
idx++;
}
while (time2 < 0)
{
sheet.pop_back();
time2++;
}
if (sheet.find(m2) != string::npos)
{
if (time > maxTime)
{
maxTime = time;
answer = title;
}
}
}
return answer;
}