N
(프로그래머스 c++ KAKAO)방금 그 곡 본문
조건이 까다로운 문제였다...
우선 문자열에서 #이 붙은 음을 다른 문자로 치환을 하여야 한다.
이 부분이 첫번째 난관이다.
본인은 맵을 이용하여 다른 문자로 치환하였다.
C#, D#, F#, G#, A#을 겹치지 않은 문자로 맵에 넣어주었다.
그리고 change() 함수를 따로 정의해서 musicinfos에 들어있는 멜로디와 m의 문자열을 #을 없앤 문자로 바꿔주었다.
change함수는 별로 어렵지 않으니 쉽게 따라갈 수 있을 것이다..!
이제 musicinfos를 분해해야 한다..!
우선 시간을 나눠야 한다.
bHour = 재생 시작된 시, bMin = 재생 시작된 분,
aHour = 재생 끝난 시, bMin = 재생 끝난 분,
time = 재생된 시간(분), bTime = 이전 곡의 재생된 시간(분) 이다.
시간은 정해진 위치에 각각 있으므로 substr을 이용하여 bHour, bMin, aHour, aMin에 int형으로 변환하여 넣어준다.
title = 현재 음악의 제목, tmp = 현재 음악의 멜로디를 저장할 변수다.
musicinfos의 12번째 인덱스부터 제목이 시작되는 부분이므로 ','가 나오면 제목과 멜로디를 각각의 변수에 넣어주도록 한다.
그리고 tmp에 들어있는 #을 다른 문자로 치환하기 위하여 다시 change() 함수를 호출하고, 치환된 멜로디를 music 변수에 넣어준다.
이제 music의 크기를 time과 비교하도록 한다.
만약 music.size() < time 이면 재생된 시간만큼 music의 멜로디를 이어 붙여야 한다.
for문을 이용하여 music을 time만큼 이어준다.
music.size() >= time 이면 재생된 시간만큼 잘라줘야 한다.
(이 부분에서 실패가 떴다..! 왜냐하면 재생된 시간보다 긴 멜로디가 들어올 수 있고, 이로 인해 답이 달라질 수 있기 때문에 멜로디를 잘라줘야 한다..!)
마지막으로 string의 find를 이용하여 적절한 제목을 찾으면 된다...!
다만
/조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다./
이 조건에 해당하는 답을 찾아야 하므로
이전 곡의 재생 시간과 현재 곡의 재생 시간을 비교하여 answer에 넣어주면 된다..!
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
string change(string &in, map<string, char> &s)
{
string out = "";
for(int i = 0; i < in.size(); i++)
{
if(in[i + 1] == '#')
{
out += s[in.substr(i, 2)];
i++;
}
else
out += in[i];
}
return out;
}
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
int bHour = 0, aHour = 0, bMin = 0, aMin = 0, time = 0, bTime = 0;
string melody = "", title = "";
map<string, char> s;
s["C#"] = 'Q';
s["D#"] = 'W';
s["F#"] = 'R';
s["G#"] = 'T';
s["A#"] = 'Y';
melody = change(m, s);
for(int i = 0; i < musicinfos.size(); i++)
{
string tmp = "", music = "";
bHour = stoi(musicinfos[i].substr(0, 2)) * 60;
bMin = stoi(musicinfos[i].substr(3, 2));
aHour = stoi(musicinfos[i].substr(6, 2)) * 60;
aMin = stoi(musicinfos[i].substr(9, 2));
time = (aHour + aMin) - (bHour + bMin);
//Divide title and Melody from musicinfos
//tmp == melody
for(int j = 12; musicinfos[i].size(); j++)
{
if(musicinfos[i][j] == ',')
{
title = musicinfos[i].substr(12, j - 12);
tmp = musicinfos[i].substr(j + 1);
break;
}
}
music = change(tmp, s);
if(music.size() < time)
{
tmp = music;
for(int j = 1; j < time / tmp.size(); j++)
music += tmp;
for(int j = 0; j < time % tmp.size(); j++)
music += tmp[j];
}
else
music = music.substr(0, time);
if(music.find(melody) != string::npos)
{
if(bTime < time)
{
answer = title;
bTime = time;
}
}
}
return answer;
}
'프로그래머스 알고리즘 > KAKAO' 카테고리의 다른 글
(프로그래머스 c++ KAKAO)수식 최대화 (2) | 2020.07.01 |
---|---|
(프로그래머스 c++ KAKAO)압축 (0) | 2020.06.11 |
(프로그래머스 c++ KAKAO)오픈 채팅방 (0) | 2020.06.03 |
(프로그래머스 c++ KAKAO)캐시 (0) | 2020.06.03 |
(프로그래머스 c++ KAKAO)프렌즈 4블록 (0) | 2020.06.02 |