본문 바로가기

problem solving

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

문제를 풀면서 여러 조건을 추가했고, 정확성이 50 -> 70 -> 98 -> 100 순으로 향상했다.

정답을 맞추긴 했지만, 내 코드가 정답이라고 하긴 어려워 보인다.

(기존 코드를 개선하기는 방법으로는 토큰화나 변환이 있다)

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
 
using namespace std;
 
vector<vector<string>> store;
 
string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    
    int cur = 0;
    string str = "";
    vector<string> vec;
    vector<pair<intint>> answerList;
    //','를 기준으로 문자열 분리
    for(int index = 0; index < musicinfos.size(); index++) {
        cur = 0, vec.clear(), str = "";
        
        while(cur < musicinfos[index].size()) {
            if(musicinfos[index][cur] != ',') {
                str = str + musicinfos[index][cur];
            } else {
                vec.push_back(str);
                str = "";
            }
            cur++;
        }
        vec.push_back(str);
        store.push_back(vec);
    }
    
    string a = "", b = "";
    string title = "";
    for(int i = 0; i < musicinfos.size(); i++) {
        //시간 계산
        a = "", b = "";
        a = a + store[i][1][0+ store[i][1][1];
        b = b + store[i][0][0+ store[i][0][1];
        int hour = stoi(a) - stoi(b);
        hour = hour * 60;
        
        a = "", b = "";
        a = a + store[i][1][3+ store[i][1][4];
        b = b + store[i][0][3+ store[i][0][4];
        int minute = stoi(a) - stoi(b);
        minute = minute + hour;
        
        title = "";
        int setTitleTime = minute;
        //'#'과 이 나오는 경우 이전 문자와 토큰화해 길이를 1로 봐야하기 때문에 '#'이 나올 때 setTitleTime값을 증가
        for(int index = 0; index < setTitleTime; index++) {
            if(store[i][3][index % store[i][3].size()] == '#') {
                setTitleTime++;
            }
            title = title + store[i][3][index % store[i][3].size()];
        }
        //"ABCD#"일 때 setTitleTime값이 4라면 'D#'이 아닌 'D'가 추가되기 때문에 아래의 조건문을 추가한다.        
        if(store[i][3][setTitleTime % store[i][3].size()] == '#') {
            title = title + '#';
        }
         
        //m과 title[k:k+m.length()]를 처음 문자부터 마지막 문자까지 비교해서 
        //반복문이 마지막에 도달하면서 그 다음 문자가 '#'이 닐 때 정답 배열에 추가
        for(int k = 0; k < title.length(); k++) {
            for(int j = k; j < k + m.size() && j < title.length(); j++) {
                if(title[j] != m[j - k]) {
                    break;
                }
                if(j == k + m.size() - 1 && !(j < title.length() - 1 && title[j + 1== '#')) {
                    answerList.push_back({ i, minute });
                }
            }
        }
    }
    
    int max = 0;
    for(int index = 0; index < answerList.size(); index++) {
        if(answerList[index].second > max) {
            max = answerList[index].second;
            answer = store[answerList[index].first][2];
        }
    }
    return answer;
}
cs

 

아래는 # 체크하는 부분 개선한 코드

#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<vector<string>> store;
 
string solution(string m, vector<string> musicinfos) {
    string answer = "(None)";
    
    string str = "";
    for(int index = 0; index < m.length(); index++) {
        
        if(m[index + 1== '#') {
            str = str + char(m[index] + 32);  
            index++;
        } else {
            str = str + m[index];
        }
    }
    m.clear();
    m.assign(str);
 
    int cur = 0;
    vector<string> vec;
    vector<pair<intint>> answerList;
    for(int index = 0; index < musicinfos.size(); index++) {
        cur = 0, vec.clear(), str = "";
        
        while(cur < musicinfos[index].size()) {
            if(musicinfos[index][cur] != ',') {
                if(musicinfos[index][cur + 1== '#') {
                    str = str + char(musicinfos[index][cur] + 32);    
                    cur++;
                } else {
                    str = str + musicinfos[index][cur];
                }
            } else {
                vec.push_back(str);
                str = "";
            }
            cur++;
        }
        vec.push_back(str);
        store.push_back(vec);
    }
    
    string a = "", b = "";
    string title = "";
    for(int i = 0; i < musicinfos.size(); i++) {
        a = "", b = "";
        a = a + store[i][1][0+ store[i][1][1];
        b = b + store[i][0][0+ store[i][0][1];
        int hour = stoi(a) - stoi(b);
        hour = hour * 60;
        
        a = "", b = "";
        a = a + store[i][1][3+ store[i][1][4];
        b = b + store[i][0][3+ store[i][0][4];
        int minute = stoi(a) - stoi(b);
        minute = minute + hour;
        
        title = "";
        int setTitleTime = minute;
        for(int index = 0; index < minute; index++) {
            title = title + store[i][3][index % store[i][3].size()];
        }
      
        for(int k = 0; k < title.length(); k++) {
            for(int j = k; j < k + m.size() && j < title.length(); j++) {
                if(title[j] != m[j - k]) {
                    break;
                }
                if(j == k + m.length() - 1 && !(j < title.length() - 1 && title[j + 1== '#')) {
                    answerList.push_back({ i, minute });
                }
            }
        }
    }
    
    int max = 0;
    for(int index = 0; index < answerList.size(); index++) {
        if(answerList[index].second > max) {
            max = answerList[index].second;
            answer = store[answerList[index].first][2];
        }
    }
    return answer;
}
cs

'problem solving' 카테고리의 다른 글

[프로그래머스]파일명 정렬  (0) 2020.07.13
[프로그래머스]압축문자열  (0) 2020.07.12
[ 프로그래머스]다음 큰 숫자  (0) 2020.03.28
[프로그래머스]단체사진 찍기  (0) 2020.03.28
[SWEA]2814. 최장 경로  (0) 2020.03.15