반응형
문제를 봤을 때 역시나 카카오는 문자열을 예쁘게(?) 준다.
#접근방법
(1)
먼저 m 의 문자열은 12개의 문자열을 나타낸다.
여기서 중요한 점은 'C#' 또한 하나의 음이라는 것이다. 그렇기 때문에 본인은 '#'을 우측에 두고 있는 알파벳에다가 +10 정도를 해주면서 다른 알파벳으로 나타냈다.
즉, 'C' 는 아스키코드로 67 이기 때문에 +10 을 해주면 'M'으로 치환된다.
"CC#BCC#BCC#BCC#BCC#B" -> "CMBCMBCMBCMBCMBCMB"
(2)
musicinfos의 각 문자열을 잘라야 하는데 쉼표를 찾을때 마다 잘라야한다.
문자열 자르는 것이 어렵다면 위의 글을 한번 읽어보는 것을 추천한다.
문자열을 잘라서 시작 시간과 끝나는 시간을 저장하는데
이때, 시 단위를 분 단위 변환한다.
ex) 01:15 ~ 02:05 -> 75 ~ 125 (재생시간 50분)
(3)
musicinfos 안에 있는 악보 내용 또한 1번과 같이 수정한다. (# 없애기)
(4)
M의 값을 갖고 있는 음악이면서 가장 긴 재생시간을 갖고 있다면 answer 변수에 음악 제목을 저장한다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string solution(string m, vector<string> musicinfos) {
string answer = "";
int max_time =-1;
int pos;
while((pos = m.find('#'))!=string::npos){
m[pos-1]=m[pos-1]+10;
m = m.substr(0,pos)+m.substr(pos+1);
}
for(int i=0; i<musicinfos.size(); i++){
string s = musicinfos[i];
int cnt =0, s_t, e_t;
string title, content;
while((pos= s.find(','))!=string::npos){
if(cnt==0){
string temp = s.substr(0, pos);
s_t = 60*stoi(temp.substr(0,2))+stoi(temp.substr(3,2));
}
else if(cnt==1){
string temp = s.substr(0,pos);
e_t = 60*stoi(temp.substr(0,2))+stoi(temp.substr(3,2));
}
else title = s.substr(0,pos);
cnt++;
s = s.substr(pos+1);
}
content = s;
while((pos = content.find('#'))!=string::npos){
content[pos-1]=content[pos-1]+10;
content = content.substr(0,pos)+content.substr(pos+1);
}
string temp ="";
for(int i=0; i<(e_t-s_t)/content.size(); i++){
temp+=content;
}
temp+=content.substr(0, (e_t-s_t) % content.size());
if(temp.find(m)!=string::npos){
if(max_time<e_t-s_t){
max_time = e_t-s_t;
answer = title;
}
}
}
if(max_time ==-1)answer ="(None)";
return answer;
}
반응형
'프로그래머스 > Level_2' 카테고리의 다른 글
[프로그래머스 Level_2 / C++ / 카카오] [3차] 압축 (0) | 2022.02.20 |
---|---|
[프로그래머스 Level_2 / C++ / 카카오] [3차] n진수 게임 (0) | 2022.02.18 |
[Level_2 / C++ / 카카오] 괄호 변환 (0) | 2022.01.29 |
[Level_2 / C++ / 카카오] 메뉴 리뉴얼 (0) | 2022.01.28 |
[Level_2 / C++ / 카카오] k진수에서 소수 개수 구하기 (0) | 2022.01.25 |
댓글