해설
musicinfos에 입력된 각 문자열을 파싱하여 벡터에 저장한다.
각 음악마다 총 재생시간을 계산하고, 총 재생시간 동안 플레이된 전체 악보를 구한다.
재생된 전체 음악에 m(들은 부분)과 일치하는 부분이 있으면 결과 벡터에 저장한다.
결과 벡터를 우선순위 대로 정렬하여 가장 우선순위가 높은 음악의 제목을 리턴한다.
전체 코드
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <climits>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using ii = pair<int, int>;
using iii = tuple<int, int, int>;
using iis = tuple<int, int, string>;
string solution(string m, vector<string> musicinfos) {
vector<iis> ret;
for (int i=0; i<musicinfos.size(); i++) {
string s =musicinfos[i];
//s를 파싱하여 {시작 시간, 끝 시간, 제목, 악보}로 저장
vector<string> v;
int st = 0, en = 0;
for (int j=0; j<4; j++) {
en = s.find(",", st);
v.push_back(s.substr(st, en-st));
st = en+1;
}
//두 시각의 차이를 구해 총 시간 계산
int t1 = stoi(v[0].substr(0, 2))*60+stoi(v[0].substr(3));
int t2 = stoi(v[1].substr(0, 2))*60+stoi(v[1].substr(3));
int time = t2-t1;
//총 시간 동안 play된 전체 음악 구하기
int cnt = 0, idx = 0;
string play = "";
while (cnt < time) {
play += v[3][idx];
if (idx+1 < v[3].size() && v[3][idx+1] == '#') play += v[3][++idx];
cnt++; idx++;
if (idx >= v[3].size()) idx = 0;
}
//재생된 전체 음악에 m과 일치하는 부분이 있는지 확인 후 결과 벡터에 {총 시간, -순서, 제목}으로 추가
int sz = play.size(), msz = m.size();
for (int j=0; j<sz; j++) {
if (play.substr(j, msz) != m) continue;
if (j+msz < sz && play[j+msz] == '#') continue;
ret.push_back({time, -j, v[2]});
break;
}
}
if (!ret.size()) return "(None)";
//정렬 후 가장 앞에 있는 원소의 제목 리턴
sort(ret.begin(), ret.end(), greater<>());
return get<2>(ret[0]);
}
'대딩 > 프로그래머스풀이' 카테고리의 다른 글
[프로그래머스 lv2] [3차]파일명 정렬 풀이 (0) | 2022.03.22 |
---|---|
[프로그래머스 lv2] [3차]압축 풀이 (0) | 2022.03.21 |
[프로그래머스 lv1] [1차]다트게임 풀이 (0) | 2022.03.21 |
[프로그래머스 lv1] [1차]비밀지도 풀이 (0) | 2022.03.20 |
[프로그래머스 lv2] [1차]프렌즈4블록 풀이 (0) | 2022.03.20 |
댓글