티스토리 뷰
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <map>
using namespace std;
string change(string in) {
string out = "";
map<string, char> m = {
{"A#", 'H'}, {"B#", 'I'}, {"C#", 'J'}, {"D#", 'K'}, {"E#", 'L'}, {"F#", 'M'}
};
//#을 대응되는 문자로 변환
for (int i = 0; i < in.size(); i++) {
if (i + 1 < in.size() && in[i + 1] == '#') {
string tmp = in.substr(i, 2);
out += m[tmp];
i++; // #을 건너뛰기
}
else out += in[i]; // 일반 문자 그대로 추가
}
return out;
}
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
int time = 0;
//변환
m = change(m);
for (int i = 0; i < musicinfos.size(); i++) {
stringstream ss(musicinfos[i]);
vector<string> parts;
string part;
while (getline(ss, part, ',')) parts.push_back(part);
// 시작 시간
int s_hour = 60 * stoi(parts[0].substr(0, 2));
int s_min = stoi(parts[0].substr(3, 2));
// 종료 시간
int e_hour = 60 * stoi(parts[1].substr(0, 2));
int e_min = stoi(parts[1].substr(3, 2));
// 재생 시간 계산
int play_time = (e_hour + e_min) - (s_hour + s_min);
if (time >= play_time) continue; // 재생 기간이 가장 긴 곡 선택
string tmp = parts[3];
string c_tmp = change(tmp); // 현재 곡을 변환
// 곡의 길이가 재생 시간보다 짧으면 반복
while (c_tmp.size() < play_time) {
c_tmp += c_tmp;
}
// 곡 길이를 맞추기 위해 자르기
c_tmp = c_tmp.substr(0, play_time);
// m과 c_tmp 비교
if (c_tmp.find(m) != string::npos) {
answer = parts[2];
time = play_time;
}
}
return answer;
}
먼저 문자열을 쉼표를 기준으로 나누고, 여기서 얻은 시작 시간과 종료 시간 문자열을 통해 플레이된 시간을 구해준다.
그리고 #처리를 위해 따로 map을 통해 아래와 같이 매핑을 해주었다.
{"A#", 'H'}, {"B#", 'I'}, {"C#", 'J'}, {"D#", 'K'}, {"E#", 'L'}, {"F#", 'M'}
따라서 #이 붙은 문자는 위와 같이 다른 문자로 변환을 해준다.
이는 입력 m과 musicinfos에서 슬라이싱한 문자열 모두 해준다.
그러고나서 해당 곡의 길이를 체크하여 재생 시간보다 짧다면 반복하여 더해준다.
반복하여 더해주면 곡의 길이가 또 너무 길어질 수 있는데, 플레이 시간에 맞춰 다시 잘라주는 작업을 해준다.
이제 변환된 악보에서 변환된 멜로디가 존재하는지 체크하여 있다면 곡을 담아준다.
이때 플레이 타임도 같이 저장해주는데, 여기서 저장한 변수 time은 재생 기간이 가장 긴 곡을 선택하는데 사용된다.
코드를 보면 재생 시간 계산 후에 if문이 있는데, 여기서 저장된 time이 플레이된 시간보다 크거나 같다면 이미 재생 기간이 길기에 굳이 다른 곡을 찾을 필요가 없다.
'프로그래머스 > 2레벨' 카테고리의 다른 글
[프로그래머스 2레벨] 줄 서는 방법 (C++) (0) | 2025.03.02 |
---|---|
[프로그래머스 2레벨] 무인도 여행 (C++) (0) | 2025.03.02 |
[프로그래머스 2레벨] 서버 증설 횟수 (C++) (0) | 2025.02.27 |
[프로그래머스 2레벨] 배달 (C++) (0) | 2025.02.27 |
[프로그래머스 2레벨] 메뉴 리뉴얼 (C++) (0) | 2025.02.26 |