• Home
  • About
    • Dochoi의 소소한 코딩 모음 photo

      Dochoi의 소소한 코딩 모음

      코딩을 하면서 느낀점들을 모은 공간입니다.

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
    • AI
    • Algorithm
    • Algorithm-Test
    • Cloud
    • Docker
    • Kubernetes
    • iOS
    • Culture
  • Projects

[프로그래머스] : 방금 그곡

16 Jun 2020

Reading time ~2 minutes

algorithm-test
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int what_time(string &s)
{
    int start_hour = stoi(s.substr(0,2));
    int start_minute = stoi(s.substr(3,2));
    int end_hour = stoi(s.substr(6,2));
    int end_minute = stoi(s.substr(9,2));
    if (end_hour < start_hour)
        end_hour += 24;
    return (((end_hour - start_hour) * 60) + end_minute - start_minute);
}
typedef struct Node{
    string s;
    int idx;
    int play_time;
}node;
string music_total_and_key_parsing(string &s, int time, string &music_key, string &music_name, string &m)
{
    int cnt = 0;
    string answer = "";
    for(int i = 0; i < s.size(); i++)
    {
        if (cnt == 2 && s[i] != ',')
            music_name += s[i];
        if (cnt == 3)
            answer += s[i];
        if (s[i] == ',')
            cnt++;
    }
    // int m_size = m.size();
    // int answer_size = answer.size();
    music_key = answer;
    answer = "";
    for(int i = 0; i < time; i++)
    {
        if (i > music_key.size() - 1)
        { if( music_key[i % music_key.size() ]== '#')
        time++;
            answer += music_key[i % music_key.size() ];
        }
        else
        {
             if(music_key[i] == '#')
        time++;
            answer += music_key[i];
        }

    }
    return answer;
}

bool cmp (node* a, node * b)
{
    if (a->play_time == b->play_time)
        return a->idx > b->idx;
    return a->play_time < b->play_time;
}
string solution(string m, vector<string> musicinfos) {
    string answer = "";
    vector<node*> v;
    for(int i = 0; i < musicinfos.size(); i++)
    {
        // cout << what_time(musicinfos[i] ) << " " << endl;
        int play_time =  what_time(musicinfos[i] ); // 실행시간
        string music_key = "";
        string music_name = "";
        string total_music = music_total_and_key_parsing(musicinfos[i], play_time, music_key, music_name, m); //총시간, 키, 이름 파싱

        string temp = "";
        for(int j = 0; j < m.size(); j++)
        {
            if (m[j] == '#')
                temp.back() += 32;
            else
                temp += m[j];
        }

        m = temp;
        temp = "";  
        for(int j = 0; j < total_music.size(); j++)
        { if (total_music[j] == '#')
                 temp.back() += 32;
            else
                temp += total_music[j];
            
        }
        total_music = temp;
//cout << total_music << endl;
         if (total_music.find(m) != string::npos) { // 키가 일치하면
            node* nnode = new node;
             nnode->s = music_name;
             nnode->play_time = play_time;
             nnode->idx = i;
            v.push_back(nnode); // 벡터에 넣어논다.

         }
    }
    sort(v.begin(), v.end(), cmp);
    if (v.size() == 0)
        return "(None)";
    return v.back()->s;
}

구현방법

string에서 ,를 기준으로 계속 파싱한다.

파싱한 시간으로 플레이 타임을 구한다.

플레이 타임만큼 재생된 노래 전체 구간을 구한다.

문자 뒤에 #이 붙을경우 이를 구분하기 위해 소문자로 바꿔준다.

find함수를 이용해서 들은 멜로디와 전체 노래 구간을 비교해서

벡터에 넣는다.

벡터는 인덱스, 플레이타임, 제목으로 이루어진 노드이다.

인덱스, 플레이타임을 기준으로 소트를 한다.

유의해야 할점

#이 붙을경우를 유의하자 (string size)

플레이 타임이 같을경우 idx순으로 리턴하는점을 유의하자



Algorithm-TestProgrammersKakao Share Tweet +1