[프로그래머스] [3차] 방금그곡

민스킴·2023년 10월 5일
0

프로그래머스

목록 보기
1/2

오랜만에 프로그래머스 레벨2 [3차]방금그곡 문제를 풀었는데, 삽질한 것을 기록하려고 글을 쓴다.

초반에는 금방 풀려서 예상보다 쉽다고 생각하면서 제출했는데 계속 틀렸다.
30번에서 계속 틀려서 이유를 찾느라 2시간은 붙잡은 것 같다.

범인을 찾았는데 "음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다." 이 조건 때문에 틀린 것이였다.

이 조건 충족 안시켜주니까 테스트 30번이 계속틀렸다.
심지어 조건을 충족시키기 위해서 음악의 길이를 세는 과정에서 "#"의 존재를 잊어서 개수가 계속 틀렸었다....!

알고보니 꼼꼼하지 못하면 쉽게 풀 수 없는 문제였다.
역시나 방심하면 안된다. 카카오


#include <string>
#include <sstream>
#include <vector>

using namespace std;

int getPlayTime(string startTime, string endTime) {
	int startHour = stoi(startTime.substr(0, 2));
	int startMin = stoi(startTime.substr(3, 2));
	int endHour = stoi(endTime.substr(0, 2));
	int endMin = stoi(endTime.substr(3, 2));
	return (endHour - startHour) * 60 + (endMin - startMin);
}

vector<string> split(string input, char delimiter) {
	vector<string> result;
	stringstream ss(input);
	string tmp;

	while (getline(ss, tmp, delimiter)) result.push_back(tmp);

	return result;
}

string solution(string m, vector<string> musicinfos) {
	string answer = "";
	int longTime = 0;

	string startTime, endTime, title, melody;
	for (int i=0; i<musicinfos.size(); ++i) {
		vector<string> info = split(musicinfos[i], ',');
		startTime = info[0]; // 음악 시작 시간
		endTime = info[1]; // 음악 끝난 시간
		title = info[2]; // 음악 제목
		melody = info[3]; // 악보 정보

		int playTime = getPlayTime(startTime, endTime);
		int cnt_start = -1; // #을 제외하고 음의 개수를 세기 위한 변수
		for (int j=0; j<melody.size(); ++j) {
			if (melody[j] == '#')
				continue;
			++cnt_start;
			int m_idx = 0; // m_idx: m의 인덱스
			int idx = j; // idx: melody의 인덱스
			int cnt = cnt_start; // cnt: #을 제외한 melody의 음 개수
			while (m_idx < m.size() && m[m_idx] == melody[idx] && cnt < playTime) {
				++m_idx;
				idx = (idx + 1) % melody.size();
				if (melody[idx] != '#')
					++cnt;
			}
			if (m_idx == m.size()) { // m이 melody에 포함되는 경우
				if (melody[idx] == '#')
					continue; // #이 붙은 음은 다른 음과 구분되지 않으므로 continue
				if (longTime < playTime) {
					longTime = playTime; // 재생 시간 갱신
					answer = title; // 제목 갱신
				}
			}
		}
	}
	if (longTime == 0)
		return "(None)"; // 일치하는 음악이 없는 경우
	return answer;
}
profile
Boys, be ambitious!

0개의 댓글