본문 바로가기
프로그래머스

프로그래머스 [3차] 방금그곡 (2018 KAKAO BLIND RECRUITMENT)

by 콩순이냉장고 2021. 7. 31.

문제 URL : https://programmers.co.kr/learn/courses/30/lessons/17683

 

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

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

programmers.co.kr

문제접근법 : 레벨2 문제였지만 개인적으로 3정도는 된다고 생각합니다.

c++로 푼다면 문자열 STL을 쓸줄 모른다면 진짜 노가다 문제입니다.

c++ regex를 이용해서 #으로 끝나는 단어들을 전부 바꿔주시면 C# -> c 가 될테니 다른음과 마찬가지로 한개의 문자가 되어 C와 C#을 따로 고민할 필요가없겠죠? regex를 이용하시는게 정말 편합니다. 그걸이용하세요

split를 따로구현해서  ,(콤마)로 문자열을 분리하면 반드시 4개의 문자열이 나옵니다.

 

시간함수 따로 구현한다음 문제에 조건대로

시뮬레이션 구현하면 되는문제입니다.

이건 문자열 다루는 문제라 c++을 알고리즘으로 공부하신다면 문자열 약하신분은 문자열 자르기나 regex부분을 공부하시고 푸는게 좋을듯합니다.

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <bits/stdc++.h>
using namespace std;
vector<string> before = { "C#","D#","F#","G#","A#" };
vector<string> after = { "c","d","f","g","a" };
 
vector<string> split(string& s,char delimiter=' ') {
    stringstream ss(s);
    vector<string> v;
    string temp;
    while (getline(ss, temp, delimiter))v.push_back(temp);
    return v;
}
 
 
//#으로 끝나는 음을 전부 소문자로 바꿈
string Replace(string s) {
    for (int i = 0; i < before.size(); i++)
        s = regex_replace(s, regex(before[i]), after[i]);
    return s;
}
//시간으로 바꾸기
int toTime(string s) {
    int h = stoi(s.substr(02));
    int m = stoi(s.substr(32));
    return h * 60 + m;
}
string solution(string m, vector<string> musicinfos) {
    string answer = "";
    vector<tuple<intintstring>>res;//재생시간, 인덱스, 음악제목
    m = Replace(m);
 
    for (int i = 0; i < musicinfos.size(); i++) {
        vector<string> v = split(musicinfos[i], ','); // ,를 기준으로 자름 4개의 문자열이나옴
        int time = toTime(v[1]) - toTime(v[0]);
        if (time < m.size())continue//재생시간이 m길이보다 작다면 그음악은 될수없음
        string s;
        v[3= Replace(v[3]);
        for (int j = 0; j < time; j++)
            s += v[3][j % v[3].size()];
 
        for (int j = 0; j <= s.size() - m.size(); j++) {
            string t = s.substr(j, m.size());//인덱스 처음부터 다잘라보고 맞는거 찾음
            if (t == m) {
                res.push_back({ -time,i,v[2] });
                break;
            }
        }
    }
    if (res.empty())
        return "(None)";
    sort(res.begin(), res.end());
    return get<2>(res[0]);
}
cs

 

 

궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.