본문 바로가기
알고리즘/KAKAO

2018 KAKAO BLIND ) 방금그곡 (C++)

by twinkite 2021. 10. 13.
반응형

2018 KAKAO BLIND RECRUITMENT [3차] 방금그곡

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

 

카카오 신입 공채 3차 코딩 테스트 문제 해설

블라인드 채용으로 관심을 모은 카카오 신입 공채의 세 번째 테스트가 지난 10월 29일(일), 오후 2시부터 6시까지 네 시간에 걸쳐 오프라인으로 치러졌습니다. 두 차례의 온라인 테스트를 통과한

tech.kakao.com

프로그래머스 스킬체크 도전중에 나온 문제다. 스스로 푸는 데에는 실패하고 결국 다른분의 코드를 참고했다. 

일단 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;
}

 

반응형