[Programmers] 방금그곡

김민석·2021년 10월 4일
0

프로그래머스

목록 보기
16/30

문자열 안에서 중복되는 문자열을 찾는 문제이다.

문제 해결 전략
전략이라 할 것 없이 곡을 시간만큼 늘린 다음 그 안에서 특정 곡을 찾는 문제이다.

생각해야 할 점은 곡 정보 중 한 음이 #을 포함하는 경우가 있는 점이다.

이 경우는 #을 포함하는 음을 소문자로 바꾸어서 저장을 하면 된다.

  • 문자열 안에 특정 문자열이 있는지 확인하기
    str.find(찾을 문자열)를 사용한다.
    만약 내부에 존재하면 첫번째로 일치하는 문자의 위치를 반환해 준다.
    존재하지 않는다면 string::npos(쓰레기값)을 반환해 준다.
ex)
string str1 = "abcde";
string str2 = "ab";
string str3 = "fg";

if(str1.find(str2) == string::npos)
	return 0;
else if(str1.find(str3) == string::npos)
	return -1;

// 실행결과
-1 반환

참고 : 문자열 찾기

코드

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

using namespace std;

int getTime(string t1, string t2){
    string h1 = "";
    string m1 = "";
    h1 += t1[0]; h1 += t1[1]; m1 += t1[3]; m1 += t1[4];
    
    string h2 = "";
    string m2 = "";
    h2 += t2[0]; h2 += t2[1]; m2 += t2[3]; m2 += t2[4];
    
    int s1 = stoi(h1)*60 + stoi(m1);
    int s2 = stoi(h2)*60 + stoi(m2);
    return s2-s1;
}
string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    int mt = -1;
    
    for(int i=0;i<musicinfos.size();i++){
        string info[4]; // 시작, 끝, 제목, 코드
        int flag = 0;
        string tmp = "";
        for(int j=0;j<musicinfos[i].size();j++){
            if(musicinfos[i][j] == ','){
                info[flag] = tmp;
                tmp = "";
                flag++;
            }else{
                if(musicinfos[i][j] == '#'){
                    tmp[tmp.size()-1] = tolower(tmp[tmp.size()-1]);
                }else
                    tmp += musicinfos[i][j];
                if(j == musicinfos[i].size()-1){
                    info[flag] = tmp;
                }
            }
        }
        
        int time = getTime(info[0], info[1]);
        
        string total = "";
        for(int j=0;j<time;j++){
            int idx = j%(info[3].size());
            total += info[3][idx];
        }
        
        string change = "";
        for(int j=0;j<m.size();j++){
            if(m[j] == '#'){
                change[change.size()-1] = tolower(change[change.size()-1]);
            }else{
                change += m[j];
            }
        }
        
        if(total.find(change) != string::npos){
            if(time > mt){
                mt = time;
                answer = info[2];
            }
        }
        
    }
    
    return answer;
}

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

profile
김민석의 학습 정리 블로그

0개의 댓글