본문 바로가기

프로그래머스/문자열

방금 그곡 - Kakao Blind recruitment

728x90

programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

#include <string>
#include <vector>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include<cstring>
using namespace std;

string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    vector<string>musics;
    vector<string>melodies;
    vector<int> ontimes;
   for(int i=0; i<musicinfos.size(); i++){
        string s = musicinfos[i];
        int shour = stoi(s.substr(0,2));
        int sminute = stoi(s.substr(3,2));
        int ehour = stoi(s.substr(6,2));
        int eminute = stoi(s.substr(9,2));
        int totalminutes = (ehour-shour)*60 + (eminute-sminute);
        int k = 12;
        string music;
        while(s[k]!=','){
            music+=s[k];
            k++;
        }
         string melody ="";
         string realmelody="";
         melody = s.substr(k+1);
         int  j=0;
         while(j<melody.size()){
                if(melody[j]=='#'){melody.erase(j,1);melody[j-1]=melody[j-1]-('A'-'a');continue;}//#이붙어있는것은 소문자로 변경
                j++;
        }
        int musicsize = melody.size();
        int times = totalminutes/musicsize;
        int rest = totalminutes%musicsize;

        for(int i=0; i<times; i++){
           realmelody=realmelody+melody;
        }
         j =0;
        int t =0;
        int melodysize = melody.size();
        while(j<rest){
             realmelody+=melody.substr(j,1);
            j++;
        }
        ontimes.push_back(totalminutes);
        musics.push_back(music);
        melodies.push_back(realmelody);
 
         }
    int j =0;
    while(j<m.size()){
                if(m[j]=='#'){m.erase(j,1);m[j-1]=m[j-1]-('A'-'a');continue;} //#이 붙어있는 것은 소문자로 변경
                j++;
    }
     vector<int>candidates;
    for(int i=0; i<melodies.size(); i++){
        if(melodies[i].find(m)!=std::string::npos){
            candidates.push_back(i);
        }
    }
  
    if(candidates.size()==1){
        answer = musics[candidates[0]];
        return answer;
    }
    else if(candidates.size()>1){
        int maxidx = candidates[0]; //후보중에 가장 앞에 있는 것부터 비교를 해야한다. 무작정 0부터 비교하는 실수 하지 않기
       for(int p=1; p<candidates.size(); p++){
            if(ontimes[maxidx]<ontimes[candidates[p]]){
                maxidx = candidates[p];
             }
      }
            answer = musics[maxidx];
   }
   

    
    return answer;
}

<JAVA>

class Solution {
   //1시간 7분
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int anslen =0;
        for(int i=0; i<musicinfos.length; i++){
            
            String str = musicinfos[i];
            
            int hs = Integer.parseInt(str.substring(0,2));
            int hm = Integer.parseInt(str.substring(3,5));
            int is = hs*60+hm;
            hs = Integer.parseInt(str.substring(6,8));
            hm = Integer.parseInt(str.substring(9,11));
            
            int ie = hs*60+hm; //시간 계산
            int len = ie-is; //재생된시간
    
            int a =12;
            String title="";
            while(str.charAt(a)!=','){
                title+=str.charAt(a); //제목
                a++;
            }
            a++;
            String melody = str.substring(a); //멜뢰디
            int melodysz = melody.length(); //멜로디 개수
            for(int t=0; t<melody.length(); t++){ //실제 멜로디의 개수를 구한다
                if(melody.charAt(t)=='#'){ 
                    melodysz--;
                }
            }
                  
            String total="";
            if(melodysz<=len){ //재생시간이 멜로디보다 길때
                for(int j=0; j<(len/melodysz); j++){ // 재생시간을 멜로디 길이 나눈 만큼 멜로디를 붙여준다
                    total+=melody;
                }
            }
                int midx =0;
                for(int j=0; j<(len%melodysz); j++){ // 멜로디길이 나눈 나머지 만큼 멜로디럴 넣어준다 이때'#'은 하나의 멜로디가 아닌걸 주의!
                    if(melody.charAt(midx)=='#'){
                        total+=melody.charAt(midx);
                        midx++;
                    }
                     total+=melody.charAt(midx);
                    midx++;
                }
            
            boolean tg =false;
            for(int k=0; k<total.length(); k++){ //문자열 하나하나 모두 확인해 가야한다!
                int tidx =k;
                int idx =0;
                while(tidx<total.length() && idx<m.length() && total.charAt(tidx)==m.charAt(idx)){
                    idx++; 
                    tidx++;
                }
                if(idx==m.length()){
                    if(tidx == total.length()){tg=true;}
                    if(tidx<total.length() && total.charAt(tidx)!='#'){ //그다음이 '#' 이 되면 안된다.
                        tg = true;
                    }
                }
            }
            
              if(tg && anslen<len){
                    answer =title;
                    anslen = len;
                }
            
            /*if(total.contains(m)){   //contains를 써서 확인이 안되는 이유: ABC# , ABC 모두 존재할 경우 이 코드가 안먹힌다.
                String tmp = m+'#';
                if(total.contains(tmp)){continue;}
                if(answer.length()<title.length()){
                    answer =title;
                }
            }*/
        }
        if(answer.length()==0){answer="(None)";}
        return answer;
    }
}

'프로그래머스 > 문자열' 카테고리의 다른 글

추석 트래픽  (0) 2021.01.29
JadenCase 문자열 만들기  (0) 2021.01.27
오픈채팅방  (0) 2021.01.21
뉴스 클러스터링- 카카오 기출  (0) 2021.01.19
N진수 게임  (0) 2021.01.15