Language/C++

[프로그래머스][Level2][C++][String] 2018 KAKAO BLIND RECRUITMENT[3차] - 방금 그곡 - 컴도리돌이

컴도리돌이 2021. 8. 21. 09:00
728x90
 

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

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

programmers.co.kr

 

  1.  처음 구현할 때 어렵지 않게 코드를 작성했지만, 생각보다 어렵게 걸렸다.
  2.  #에 대한 처리를 하지 않아서 다른 분의 코드를 참고해서 치환이라는 좋은 아이디어가 있어 #이 붙어진 음표를 소문자로 치환을 했다.
  3.  치환을 하고 나서 아직도 여러 테스트 케이스에서 오답처리가 되어서 뭐가 문제일까 고민을 하다가,, 음악의 치환 위치를 잘못 선정하여 여러 테스트 케이스에서 오답에 생겼던 거다.
  4.  하지만 위치 선정을 하고 나서도 15,29,30번에서 테스트 케이스에서 오답이 되어서 매우 어려움을 겪고 있었다.
  5.  차근차근 문제를 읽어봤다.
  6.  음악이 없을 때 (None) 처리를 했는가 -> answer = "(None)"  (O)
  7.  기억하는 멜로디와 주어진 음악을 치환을 했는가? -> change(m) , change(melody) (O)
  8.  주어진 음악보다 시간이 클 때 반복적으로 처리했는가? 또는 시간이 작을 때는 부분적으로 처리했는가? -> while(real.size() <time)  real += melody;  real = real.substr(0, time); (O)
  9.  재생 시간이 같을 경우 먼저 입력된 악보를 먼저 선택했는가? -> max < real.size() (O)
  10.  모든 경우의 수를 체크했지만 모두 다 정확하게 처리했다. 그럼 처음 시간과 음악 제목과 음악을 잘 못 선정했는지? (X)
#include <string>
#include <vector>
#include <cstdlib>

using namespace std;

void change(string& ss)
{
    for(int i=0; i<ss.length();)
    {
        if(ss[i] == '#') ss[i-1] = tolower(ss[i-1]),ss.erase(ss.begin() + i);
        else i++;
    }
}

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int max = 0;
    change(m);
    for(auto v : musicinfos)
    {
        int shh = stoi(v.substr(0,2))*60,
            smm = stoi(v.substr(3,2)),
            ehh = stoi(v.substr(6,2))*60,
            emm = stoi(v.substr(9,2)),
            time = abs(ehh + emm) - abs(shh + smm);
        string info = v.substr(12),
               title= info.substr(0,info.find(',')),
               melody= info.substr(info.find(',')+1),
               real = "";

        change(melody);

        real = melody;

        while(real.size() < time) real += melody;

        real = real.substr(0,time);

        if(real.find(m) != string :: npos)
            if(max < real.size()) 
                max = real.length(), answer = title;
    }
    return answer;
}

int main(void)
{
    cout << solution("ABCDEFG",{"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"}) << endl;
    cout << solution("CC#BCC#BCC#BCC#B",{"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"}) << endl;
    cout << solution("ABC",{"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"});
    cout << solution("ADC",{"11:56,12:43,DD,ADC#AD", "14:32,16:23,ZZ,ADC#ADC#"});
    cout << solution("AA",{"11:00,11:34,AA,ABBCCA#A#A#AB#", "11:08,11:13,BB,ABC#D#"});
}