본문 바로가기
알고리즘/프로그래머스

알고리즘(C++) / 프로그래머스 level 2 : 방금그곡

by clean_h 2021. 8. 24.
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

댓글