본문 바로가기

코딩테스트/프로그래머스

[프로그래머스] [3차] 방금그곡

728x90
반응형


🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


반응형
728x90

👩‍💻 코드

#include <string>
#include <vector>
#include <sstream>
#include <cctype>
#include <iostream>

using namespace std;

string ConvertMelody(string melody) {
    string result;
    
    for (int i = 0; i < melody.size(); i++) {
        if (i + 1 < melody.size() && melody[i + 1] == '#') {
            result += tolower(melody[i]);
            i++;
        } else {
            result += melody[i];
        }
    }
    return result;
}

vector<string> Split(const string& str) {
    vector<string> tokens;
    string token;
    stringstream ss(str);
    
    while (getline(ss, token, ',')) {
        tokens.push_back(token);
    }
    
    return tokens;
}

int GetMusicTime(const string& info){
    int hours = stoi(info.substr(0,2));
    int minutes = stoi(info.substr(3,2));
    return hours * 60 + minutes;
}

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int longestPlayTime = 0;

    m = ConvertMelody(m);
    
    for(int i=0; i<musicinfos.size(); i++){
        vector<string> v = Split(musicinfos[i]);
        int startTime = GetMusicTime(v[0]);
        int endTime = GetMusicTime(v[1]);
        int totalTime = endTime - startTime;
        
        string music = ConvertMelody(v[3]);
        string playedMusic;
        
        for (int j = 0; j < totalTime; j++) {
            playedMusic += music[j % music.size()];
        }
        
        if (playedMusic.find(m) != string::npos) {
            if (totalTime > longestPlayTime) {
                longestPlayTime = totalTime;
                answer = v[2];
            }
        }
    }
    
    return answer;
}

📝 풀이

ConvertMelody 함수는 #이 들어간 음을 소문자로 치환하는 함수입니다. (C# 👉 c)

Split 함수는 하나의 문자열을 ',' 문자를 기준으로 나누어 vector에 저장하여 return하는 함수입니다.

GetMusicTime 함수는 'HH:MM' 문자열을 분으로 계산하는 함수입니다.

 

우선 네오가 기억하는 멜로디를 ConvertMelody 함수를 사용하여 치환합니다.

musicinfos를 Split 함수를 이용하여 나눈후 재생시간을 구합니다.

악보 정보도 ConvertMoelody 함수를 사용하여 치환한 후 재생시간에 따라 재구성합니다.

재구성된 악보에 네오가 기억하는 멜로디가 포함되어 있고 라디오에서 재생된 시간이 더 길다면 answer에 음악 제목을 저장합니다.

최종적으로 answer을 return 합니다.

 

728x90
반응형