ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 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;
    }
Designed by Tistory.