문자열 안에서 중복되는 문자열을 찾는 문제이다.
문제 해결 전략
전략이라 할 것 없이 곡을 시간만큼 늘린 다음 그 안에서 특정 곡을 찾는 문제이다.
생각해야 할 점은 곡 정보 중 한 음이 #을 포함하는 경우가 있는 점이다.
이 경우는 #을 포함하는 음을 소문자로 바꾸어서 저장을 하면 된다.
팁
ex)
string str1 = "abcde";
string str2 = "ab";
string str3 = "fg";
if(str1.find(str2) == string::npos)
return 0;
else if(str1.find(str3) == string::npos)
return -1;
// 실행결과
-1 반환
참고 : 문자열 찾기
코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int getTime(string t1, string t2){
string h1 = "";
string m1 = "";
h1 += t1[0]; h1 += t1[1]; m1 += t1[3]; m1 += t1[4];
string h2 = "";
string m2 = "";
h2 += t2[0]; h2 += t2[1]; m2 += t2[3]; m2 += t2[4];
int s1 = stoi(h1)*60 + stoi(m1);
int s2 = stoi(h2)*60 + stoi(m2);
return s2-s1;
}
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
int mt = -1;
for(int i=0;i<musicinfos.size();i++){
string info[4]; // 시작, 끝, 제목, 코드
int flag = 0;
string tmp = "";
for(int j=0;j<musicinfos[i].size();j++){
if(musicinfos[i][j] == ','){
info[flag] = tmp;
tmp = "";
flag++;
}else{
if(musicinfos[i][j] == '#'){
tmp[tmp.size()-1] = tolower(tmp[tmp.size()-1]);
}else
tmp += musicinfos[i][j];
if(j == musicinfos[i].size()-1){
info[flag] = tmp;
}
}
}
int time = getTime(info[0], info[1]);
string total = "";
for(int j=0;j<time;j++){
int idx = j%(info[3].size());
total += info[3][idx];
}
string change = "";
for(int j=0;j<m.size();j++){
if(m[j] == '#'){
change[change.size()-1] = tolower(change[change.size()-1]);
}else{
change += m[j];
}
}
if(total.find(change) != string::npos){
if(time > mt){
mt = time;
answer = info[2];
}
}
}
return answer;
}
출처 : https://programmers.co.kr/learn/courses/30/lessons/17683