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

다곰·2023년 9월 22일
0

우당탕탕 코테준비

목록 보기
75/98

✅ LV.2

📌 2018 KAKAO BLIND RECRUITMENT

✏️ 최종 솔루션

⭐️ 문자열 구현

  1. # 이 붙은 음계도 하나의 음계로 인식해야하기 하는데 문자열 탐색할 때 번거롭기 때문에 C# ➡️ c(소문자) 이런 방식으로 치환
  2. getline 으로 , 기준으로 문자열 분할하여 재생 시작 시간, 재생 종료 시간, 곡명, 음계를 저장
  3. 곡 재생 시간은 모든 시간을 분으로 치환하여 계산
  4. 전체 재생 길이가 음계보다 길면 음계가 계속 반복되므로 이를 재생 길이에 맞춰 총 재생 음계 만들기
  5. find 함수 사용하여 재생 음계에 멜로디의 포함 여부 확인하고 포함되어 있고 이전에 저장된 음계보다 재생 시간이 길면 곡명과 재생 길이 갱신

📌 self feedback

  • 문자열 치환과 특정 문자 포함 여부 확인을 위해 replace 를 사용해야했으나 익숙하지 않아서 힘들었음
  • 문제를 잘못 이해해서 원래는 음계와 멜로디가 동일하지만 음계가 중간부터 재생되어 멜로디와 맞지 않는 경우에 대해서도 처리해야 하는 줄 알았는데 그딴 거 상관없이 재생 음계 중에 멜로디가 포함되어 있기만 하면 되는 거였음;;
  • 어차피 멜로디 길이보다 재생 음계가 짧으면 멜로디 포함 못하는 것이기 때문에 멜로디 길이와 재생 음계의 길이를 비교해서 다르게 처리할 필요는 없고 일관적으로 재생 음계 안에 멜로디가 포함되었는지 여부만 확인하면 됨
    재생 음계가 기본 음계보다 짧은 경우는 처리 안하긴 했는데 걍 통과됨

🔗 문자열 find 링크
🔗 문자열 치환

✏️ 최종 code

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

using namespace std;

string nosharp(string s) {
    int len=s.size();
    for(int i=0;i<len;i++) {
        if(s[i]=='#') {
            string ch="";
            ch+=tolower(s[i-1]);
            s.replace(i-1,2,ch);
        }
    }
    return s;
}

string solution(string m, vector<string> musicinfos) {
    string answer = "";
    int ans_cnt=0;
    
    m=nosharp(m);
    
    for(int i=0;i<musicinfos.size();i++) {
        string s=musicinfos[i];
        istringstream ss(s);
        string sb;
        vector<string> v;
        while(getline(ss,sb,',')) {
            v.push_back(sb);
        }
        
        string st= v[0];
        int sh=stoi(st.substr(0,2));
        int sm=stoi(st.substr(3));
        
        string et= v[1];
        int eh=stoi(et.substr(0,2));
        int em=stoi(et.substr(3));
        
        int cnt=(eh*60+em)-(sh*60+sm);  // 곡 재생수
        
        string name= v[2];
        string music= v[3];
        
        // 전체 음계
        string total="";
        music=nosharp(music);
        
        int len=music.size();
        for(int j=0;j<cnt;j++) {
            total+=music[j%len];
        }

        if(total.find(m)!=string::npos && cnt>ans_cnt) {
            ans_cnt=cnt;
            answer=name;
        }
    }
    
    if(answer=="") return "(None)";
    
    return answer;
}
profile
다교미의 불꽃 에러 정복기

0개의 댓글