반응형
2018 KAKAO BLIND RECRUITMENT [3차] 방금그곡
프로그래머스 스킬체크 도전중에 나온 문제다. 스스로 푸는 데에는 실패하고 결국 다른분의 코드를 참고했다.
일단 C#, D#등 문자가 아닌 음이 등장하므로 해당 음을 문자로 치환해주어야 한다는 부분까지는 떠올렸는데 그 이후로 방향을 잘못 잡는 바람에 엉뚱한 부분을 고민하느라 해결하지 못했다. 네오가 들은 음은 무조건 실제 재생된 멜로디 안에 있어야 하므로 실제 재생된 멜로디를 복원하고 거기서 네오가 들은 음이 있는지 없는지를 찾아주어야 했으나 실제 재생된 멜로디를 만들 생각을 하지 못하고 네오가 들은 멜로디를 원곡에 끼워 맞추는 방향으로 생각하는 바람에 구현이 막막해서 풀이가 떠오르지 않았다.
string changeSharp(string s){
string temp;
for(int i=0;i<s.size();i++){
if(s[i]!=s.size()-1&&s[i+1]=='#'){
temp+=(s[i]-'A'+'a');
i++;
} else {
temp+=s[i];
}
}
return temp;
}
C#, D#등 #이 붙은 음을 소문자로 변경시켜 준다. 마지막 문자가 #이 아닌 경우 s[i+1]을 조회하면 에러가 발생하므로 해당 경우를 방지해준다.
string solution(string m, vector<string> musicinfos) {
m=changeSharp(m);
string answer = "";
int max=0;
for(int i=0; i<musicinfos.size();i++){
int temp_start=0;
int temp_end=0;
string h = musicinfos[i].substr(0,2);
string m = musicinfos[i].substr(3,2);
temp_start = stoi(h)*60 + stoi(m);
h = musicinfos[i].substr(6,2);
m = musicinfos[i].substr(9,2);
temp_end = stoi(h)*60 + stoi(m);
s.push_back(temp_start);
e.push_back(temp_end);
int j;
string temp_name="";
for(j=12; musicinfos[i][j]!=',';j++){
temp_name += musicinfos[i][j];
}
name.push_back(temp_name);
j++;
string temp_music="";
for(j; j<musicinfos[i].size();j++){
temp_music +=musicinfos[i][j];
}
music.push_back(changeSharp(temp_music));
}
for(int i=0;i<musicinfos.size();i++){
int diff = e[i]-s[i];
string temp_music;
for(int j=0;j<diff;j++){
temp_music += music[i][j%music[i].size()];
}
if(temp_music.find(m)!=string::npos){
if(diff>max){
max=diff;
answer=name[i];
}
}
}
if (answer=="") answer="(None)";
return answer;
}
음악에 대한 정보를 시작시간, 종료시간, 제목, 멜로디로 구분해 각각의 배열에 저장한다. 이후 실제 재생시간에 맞춰 재생된 멜로디를 만들어 낸 뒤 find를 이용해 네오가 들은 멜로디가 포함되어 있는지를 검사한다. diff가 max보다 큰 경우 가장 길게 재생된 음악이므로 재생시간과 노래 제목을 저장한다. 재생 시간이 같은 경우 먼저 들은 노래가 답이므로 큰 경우만 고려해주면 된다.
아무것도 일치하지 않은 경우 answer은 빈 문자열이므로 그 경우 "(None)"을 출력한다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> s;
vector<int> e;
vector<string> name;
vector<string> music;
string changeSharp(string s){
string temp;
for(int i=0;i<s.size();i++){
if(s[i]!=s.size()-1&&s[i+1]=='#'){
temp+=(s[i]-'A'+'a');
i++;
} else {
temp+=s[i];
}
}
return temp;
}
string solution(string m, vector<string> musicinfos) {
m=changeSharp(m);
string answer = "";
int max=0;
for(int i=0; i<musicinfos.size();i++){
int temp_start=0;
int temp_end=0;
string h = musicinfos[i].substr(0,2);
string m = musicinfos[i].substr(3,2);
temp_start = stoi(h)*60 + stoi(m);
h = musicinfos[i].substr(6,2);
m = musicinfos[i].substr(9,2);
temp_end = stoi(h)*60 + stoi(m);
s.push_back(temp_start);
e.push_back(temp_end);
int j;
string temp_name="";
for(j=12; musicinfos[i][j]!=',';j++){
temp_name += musicinfos[i][j];
}
name.push_back(temp_name);
j++;
string temp_music="";
for(j; j<musicinfos[i].size();j++){
temp_music +=musicinfos[i][j];
}
music.push_back(changeSharp(temp_music));
}
for(int i=0;i<musicinfos.size();i++){
int diff = e[i]-s[i];
string temp_music;
for(int j=0;j<diff;j++){
temp_music += music[i][j%music[i].size()];
}
if(temp_music.find(m)!=string::npos){
if(diff>max){
max=diff;
answer=name[i];
}
}
}
if (answer=="") answer="(None)";
return answer;
}
반응형