[3차]방금그곡

NJW·2022년 3월 22일
0

코테

목록 보기
18/170

들어가는 말

네오가 들은 곡을 주어진 곡과 비교해서 출력하는 문제다. 카카오 블라인드 테스트로 나온 문제로 #이 포함된 단어를 바꾸는 것과 문자열로 주어진 곡을 나눠서 들은 곡과 비교해 답을 내놓는 것이 핵심이다.

코드 설명

#이 붙은 단어는 map을 이용해서 소문자로 바꿔주는 함수를 만들었다. 다음 주어진 곡을 하나씩 돌려준다. 먼저 시간을 계산해 주고 다음은 제목과 악보를 분리해준다. 그다음 주어진 악보에 있는 #을 소문자로 바꾼다. 만일 주어진 악보가 재생 시간보다 작다면 주어진 음악을 재생 시간만큼 맞춰준다. 만일 주어진 악보가 재생 시간보다 크더라도 위의 방법과 같이 해주면 된다. 마지막으로는 주어진 음악과 들은 음악이 맞는지 확인하는 절차다. 주어진 음악과 들은 음악을 비교해서 같은 음이 존재한다면 time이 긴 음악을 넣어준다.

코드

#include <string>
#include <vector>
#include<map>
#include<iostream>

using namespace std;
/*#이 포함된 악보를 바꿔주는 함수*/
using namespace std;
/*#이 포함된 악보를 바꿔주는 함수*/
string change(string& m, map<string, char>& c_map) {
    string change_s = "";
    for (int i = 0; i < m.size(); i++) {
        if (m[i + 1] == '#') {
            /*c_map에서 key에 해당하는 value를 가지고 와서 바꿔준다.*/
            change_s = change_s + c_map[m.substr(i, 2)];
            i++;
        }
        else {
            change_s = change_s + m[i];
        }
    }

    return change_s;

}

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    map<string, char> c_map;
    string music = "";
    string title = "";
    int hour1 = 0;
    int min1 = 0;
    int hour2 = 0;
    int min2 = 0;
    int time = 0;
    int min_time = 0;

    c_map["C#"] = 'c';
    c_map["D#"] = 'd';
    c_map["F#"] = 'f';
    c_map["G#"] = 'g';
    c_map["A#"] = 'a';

    /*네오가 들은 곡의 #이 들어간 음표를 소문자로 바꿔준다.*/
    music = change(m, c_map);

    /*방송된 곡의 정보를 나눠준다.*/
    for (int i = 0; i < musicinfos.size(); i++) {

        string tmp_music = "";
        string music_1 = "";

        /*1. 시간*/
        hour1 = stoi(musicinfos[i].substr(0, 2)) * 60;
        min1 = stoi(musicinfos[i].substr(3, 2));
        hour2 = stoi(musicinfos[i].substr(6, 2)) * 60;
        min2 = stoi(musicinfos[i].substr(9, 2));
        time = (hour2 + min2) - (hour1 + min1);

        /*제목 및 악보*/
        for (int j = 12; j < musicinfos[i].size(); j++) {
            if (musicinfos[i][j] == ',') {
                title = musicinfos[i].substr(12, j - 12);
                tmp_music = musicinfos[i].substr(j + 1);
                break;
            }
        }

        /*악보에 있는 #을 map에 있는 value로 바꾼다.*/
        music_1 = change(tmp_music, c_map);

        /*주어진 악보를 time만큼 맞춰준다.*/
        if (music_1.size() < time) {
            tmp_music = music_1;
            for (int j = 1; j < time / tmp_music.size(); j++) {
                music_1 = music_1 + tmp_music;
            }
            for (int j = 0; j < time % tmp_music.size(); j++) {
                music_1 = music_1 + tmp_music[j];
            }
        }
        else {
            music_1 = music_1.substr(0, time);
        }

        /*주어진 음악과 들은 음악이 맞는지 확인*/
        if (music_1.find(music) != string::npos) {
            if (time > min_time) {
                answer = title;
                min_time = time;
            }
        }

    }

    return answer;
}

참고

https://eunchanee.tistory.com/79

profile
https://jiwonna52.tistory.com/

0개의 댓글