-
프로그래머스 17683 방금그곡 [C++]개발/문제풀이 2020. 4. 24. 14:26
오류를 찾는 데 한참 걸렸고, 문자열 처리에 관해 많이 공부한 문제가 되어서 정리.
removeSharp() 함수는 주어진 멜로디에서 #을 찾으면 전 문자를 소문자로 변경하고 #을 삭제한다. 문자열의 길이가 변화하므로 index도 변경해야 하므로 주의.
getMusicLen() 함수는 "HH:MM" 형식의 시간을 나타내는 문자열 두 개에서 정수 시간 간격을 반환한다. 문제의 조건에 따라 00:00을 넘어서 재생되는 경우가 없으므로 시간 간격이 음수가 되는 경우를 처리할 필요는 없다.
for(string info : musicinfos) 반복문에서 각 문자열 처리를 수행하고, info의 melody를 재생된 시간에 맞게 변환한다.
그리고 string::find함수를 통해 일치여부를 확인할 수 있는데 이 함수 없이 직접 구현하려다 시간을 많이 소모했다.
#include <string> #include <vector> #include <iostream> using namespace std; string removeSharp(string m) { for (int i = 0; i < m.size() - 1; i++) { if (m[i + 1] == '#') { m[i] = tolower(m[i]); m.erase(m.begin() + i + 1); i--; } } return m; } int getMusicLen(string start, string end) { int sh = stoi(start.substr(0, 2)); int eh = stoi(end.substr(0, 2)); int sm = stoi(start.substr(3, 2)); int em = stoi(end.substr(3, 2)); return (eh * 60 + em) - (sh * 60 + sm); } string solution(string m, vector<string> musicinfos) { string answer = "(None)"; int answerLen = 0; m = removeSharp(m); for (string info : musicinfos) { string startTime = info.substr(0, 5); string endTime = info.substr(6, 5); int musicLen = getMusicLen(startTime, endTime); int nameEnd = info.find(',', 12); string name = info.substr(12, nameEnd - 12); string melody = info.substr(nameEnd + 1); melody = removeSharp(melody); // 재생된 시간이 m보다 짧으면 알 수 없음 if(m.length() > musicLen){ continue; } // 재생 시간을 에 맞도록 악보 반복 while (melody.size() < musicLen) { melody += melody; } melody = melody.substr(0, musicLen); //멜로디를 포함하는지 확인 if (melody.find(m) != string::npos) { if (answerLen < musicLen) { answer = name; answerLen = musicLen; } } } return answer; }
'개발 > 문제풀이' 카테고리의 다른 글
프로그래머스 17678 추석 트래픽 [C++] (0) 2020.05.01 프로그래머스 17677 뉴스 클러스터링 [C++] (0) 2020.01.19