728x90
level 2 : 방금그곡
https://programmers.co.kr/learn/courses/30/lessons/17683?language=cpp
코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
코드
//프로그래머스 방금 그곡
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//재생 시간 구하기
int Play_time(string musicinfo) {
int start_h = stoi(musicinfo.substr(0, 2));
int start_m = stoi(musicinfo.substr(3, 2));
int end_h = stoi(musicinfo.substr(6, 2));
int end_m = stoi(musicinfo.substr(9, 2));
return (end_h - start_h) * 60 + end_m - start_m; //end시간 - start시간
}
void Change(string& m) {
//#이 존재할 때
while (m.find("#") != string::npos) {
int i = m.find("#"); //#을 찾음
string c = "";
c += (m[i - 1] + 32);
m.replace(i - 1, 2, c); // i-1 번째 부터 2개를 c로 변경
}
}
string solution(string m, vector<string> musicinfos) {
string answer = "";
vector<pair<string, string>> vec;
for (int i = 0; i < musicinfos.size(); i++) {
int play_time = Play_time(musicinfos[i]);
string musicinfo = musicinfos[i].substr(12); //시간 제외 정보
string title = musicinfo.substr(0, musicinfo.find(",")); //음악 제목
string info = musicinfo.substr(musicinfo.find(",") + 1); //악보 정보
Change(info); //악보 #음 변경
string play_music = "";
int temp = 0;
//플레이된 시간만큼 재생된 멜로디 저장
for (int j = 0; j < play_time; j++) {
play_music += info[temp];
temp++;
if (temp == info.size())
temp = 0;
}
vec.push_back(make_pair(play_music, title)); //재생된 멜로디, 음악 제목 순으로 저장
}
Change(m); //#음 변경
int long_music = 0;
for (int i = 0; i < vec.size(); i++) {
//존재할 때
if (vec[i].first.find(m) != string::npos) {
//가장 긴 노래 길이
if (long_music < vec[i].first.size()) {
answer = vec[i].second;
long_music = vec[i].first.size();
}
}
}
//조건이 일치하지 않을때
if (answer == "")
answer = "(None)";
return answer;
}
int main() {
string m = "ABC";
vector<string> musicinfos = { "12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF" };
cout << solution(m, musicinfos) << "\n";
return 0;
}
설명
- HH:MM 형식으로 나타내어져 있는 시간을 시작 시간과 끝나는 시간을 substr로 구분하여 재생시간을 구한다.
- 마찬가지로 substr로 ',' 을 찾아 음악 제목, 악보 정보를 구한다.
- 악보 정보와 기억한 멜로디에서 #이 포함되어있는 음은 하나의 문자로 변경해준다. (C# → C)
- 재생된 시간만큼 재생된 멜로디를 구한다.
- 멜로디와 음악 제목을 쌍으로 벡터에 저장한다.
- string에서 find함수를 사용하여 기억한 멜로디가 있는지 찾는다. 그 중 가장 긴 노래를 answer에 저장한다.
고찰
한시간 정도 걸렸고, 조건들이 까다로워서 어려웠던 문제였다. C, #이 모두 음으로 생각하지 않고 C 와 C#이 구분을 하지 않아서 문제가 발생하였다. 그래서 C와 C#을 구분할 수 있도록 Change함수를 만들어 소문자로 변경해줄 수 있었다.
string에서 replace 함수와 find 함수를 알아보았다.
replace
m.replace(i - 1, 2, c); // i-1 번째 부터 2개를 c로 변경
replace는 문자열의 일부를 다른 문자열로 치환한다.
https://modoocode.com/250 에서 다양한 replace 함수 사용 방법을 알 수 있다.
find
for (int i = 0; i < vec.size(); i++) {
//존재할 때
if (vec[i].first.find(m) != string::npos) {
answer = vec[i].second;
}
}
find는 찾는 문자의 위치를 int형으로 반환한다. 찾는 문자가 없다면 string::npos를 반환한다.
https://modoocode.com/241 에서 find 함수 사용 방법을 알 수 있다.
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
알고리즘(C++) / 프로그래머스 level 2 : 튜플 (0) | 2021.08.27 |
---|---|
알고리즘(C++) / 프로그래머스 level 2 : 프렌즈4블록 (0) | 2021.08.25 |
알고리즘(C++) / 프로그래머스 level 2 : 메뉴 리뉴얼 (0) | 2021.08.23 |
알고리즘(C++) / 프로그래머스 level 2 : 오픈채팅방 (0) | 2021.08.22 |
알고리즘(C++) / 프로그래머스 level 3 : 베스트앨범 (0) | 2021.08.19 |
댓글