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

 

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

 

프로그래머스

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

programmers.co.kr


 

해결전략

 

문자열 검색

 

 

 

 


 

처음 시도한 코드 - 실패

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, string>> result;

string solution(string m, vector<string> mu) {
    int n = mu.size();
	string answer = "(None)";
   
    for(int i=0; i<n; i++)
    {
        int minutes = (stoi(mu[i].substr(6, 2)) - stoi(mu[i].substr(0, 2))) * 60 + stoi(mu[i].substr(9, 2)) - stoi(mu[i].substr(3, 2));

        string name = "";
        int j = 12;
        while(true){
            if (mu[i][j] == ',') break;
            name += mu[i][j];
            j++;
        }

        j++;
        int noteStart = j;
        string note = "";
        int t = 0;
        int order = 0, dif = 2147000000;
        bool found = false;
        int min = minutes;
		while(min--)
        {
            if (j == mu[i].size()) j = noteStart;

            if (mu[i][j] == m[t])
            {
				if (dif < order - t) break;
                if (dif == 2147000000) dif = order - t;
            	t++;
            }
            //note += mu[i][j];
            j++;
            order++;

            if (t == m.size()){
                found = true;
                break;
            } 
        }

        if (found == true) {
            result.push_back({ minutes, name });
        }
    }

    if(result.size() > 0)
    {
        sort(result.begin(), result.end());
        answer = result[0].second;	    
    }
    
    return answer;
}

 

 


 

정답 코드

 

 

#include <string>    
#include <vector>    
#include <algorithm> 
using namespace std;

// '#'이 붙은 음표를 소문자로 변환하는 함수
string convert(string m) {
    string ret = "";  // 반환할 문자열 초기화
    for (int i = 0; i < m.size(); i++) {  // m의 모든 문자를 순회
        if (m[i + 1] == '#') {  // 다음 문자가 '#'인 경우
            ret += tolower(m[i]);  // 현재 문자를 소문자로 바꿔서 ret에 추가
            i++;  // '#' 문자는 처리했으므로 다음 문자로 넘어감
        }
        else {
            ret += m[i];  // '#'이 아니면 그대로 ret에 추가
        }
    }
    return ret;  // 결과 문자열 반환
}

// 특정 멜로디가 어떤 곡에서 나왔는지 찾는 함수
string solution(string m, vector<string> mu) {
    m = convert(m);  // m을 convert 함수로 전처리
    string answer = "(None)";  // 반환할 문자열 초기화
    int max_length = 0;  // 가장 긴 재생 시간을 저장하는 변수

    for (string str : mu)  // mu의 모든 곡을 순회
    {
        // 재생 시간 계산
        int playTime = (stoi(str.substr(6, 2)) - stoi(str.substr(0, 2))) * 60 + stoi(str.substr(9, 2)) - stoi(str.substr(3, 2));
        // 곡의 제목 추출
        string title = str.substr(12, str.find(',', 12) - 12);
        // 곡의 악보 추출 후 convert 함수로 전처리
        string notes = convert(str.substr(str.find(',', 12) + 1));

        // 전체 악보를 재생 시간만큼 반복해서 문자열 생성
        string note = "";
        for (int i = 0; i < playTime; i++) {
            note += notes[i % notes.size()];
        }

        // 만들어진 악보 문자열에서 m이 있는지 찾음
        if (note.find(m) != string::npos)
        {
            if (playTime > max_length) { // m이 있고, 재생 시간이 현재까지 찾은 곡보다 긴 경우
                max_length = playTime;  // 재생 시간 갱신
                answer = title;  		// 제목 갱신
            }
        }
    }
    
    return answer;
}