programmers.co.kr/learn/courses/30/lessons/17683

 

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

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

programmers.co.kr

<풀이>

1. 주어진 음악 정보 문자열을 분리하여서, 시간동안 재생된 멜로디를 구한다.

2. 시간동안 재생된 멜로디에서 네오가 기억한 멜로디가 있는지 찾는다.

3. 찾아진 음악들을 주어진 기준에 따라 정렬하고, 결과를 반환한다.

 

<해법>

문제를 푸는데 특별한 아이디어가 필요하지 않다고 생각합니다. 문제를 푸는 방법을 코드로 정확히 구현하는 것이 핵심이라고 생각합니다. 저는 문자열을 다루는 함수를 최대한 사용하여서, 구현하였습니다.

 

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
//구조체 : 음악 정보
struct music {
    int index;
    int time;
    string title;
};
 
vector<music> v;
 
//멜로디 변환 함수('#' 없애기)
string changeMelody(string s) {
 
    while (true) {
 
        //'#'을 찾기
        int index = s.find("#");
 
        //'#'이 없으면 종료
        if (index == string::npos) {
            break;
        }
 
        //'#'이 있으면, '#'전에 있는 알파벳 소문자로 변환
        char alpha = tolower(s[index - 1]);
 
        //소문자 알파벳으로 바꾸기(ex. C# -> c)
        s.replace(index - 12string(1, alpha));
    }
 
    return s;
}
 
//벡터 정렬 기준
bool compare(music a, music b) {
    if (a.time == b.time) {
        return a.index < b.index;
    }
    return a.time > b.time;
}
 
string solution(string m, vector<string> musicinfos) {
 
    string answer = "";
 
    //네오가 기억한 멜로디 -> '#'없앤 멜로디로 변환
    string neoMelody = changeMelody(m);
 
    //주어진 음악 정보 탐색
    for (int i = 0; i < musicinfos.size(); i++) {
 
        /*
        1. 시간 정보 탐색
        */
        string timeInfo = musicinfos[i].substr(011);
 
        int start_time = stoi(timeInfo.substr(02)) * 60 + stoi(timeInfo.substr(32));
        int finish_time = stoi(timeInfo.substr(62)) * 60 + stoi(timeInfo.substr(92));
 
        //총 소요시간
        int time = finish_time - start_time;
 
        /*
        2. 제목, 멜로디 정보 탐색
        */
        string musicInfo = musicinfos[i].substr(12);
 
        //',' 위치 찾기
        int comma_pos = musicInfo.find(',');
 
        //',' 위치를 기준으로 제목, 멜로디 정보 찾기
        string title = musicInfo.substr(0, comma_pos);
        string melody = musicInfo.substr(comma_pos + 1);
 
        /*
        3. 소요시간만큼 진행된 멜로디 구하기
        */
        //멜로디 변환
        melody = changeMelody(melody);
 
        string totalMelody = "";
 
        //멜로디 길이 >= 소요시간
        if (melody.length() >= time) {
            totalMelody = melody.substr(0, time);
        }
        //멜로디 길이 < 소요시간
        else {
 
            //몫만큼 멜로디를 반복
            int repeatCount = time / melody.length();
            for (int j = 0; j < repeatCount; j++) {
                totalMelody += melody;
            }
 
            //나머지 시간, 나머지 멜로디
            int remain = time % melody.length();
            totalMelody += melody.substr(0, remain);
        }
 
        /*
        4. 토탈 멜로디에서 네오 멜로디 찾기
        */
        int index = totalMelody.find(neoMelody);
 
        //멜로디를 찾은 경우 벡터에 저장
        if (index != string::npos) {
            v.push_back({ i, time, title });
        }
    }
 
    //찾은 멜로디 정렬
    sort(v.begin(), v.end(), compare);
 
    //결과 갱신
    if (v.empty()) {
        answer = "(None)";
    }
    else {
        answer = v[0].title;
    }
 
    //결과 반환
    return answer;
}
 

 

문자열과 구현에 대해 알아볼 수 있는 문제였습니다.

+ Recent posts