ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5주차 - 카카오 가사검색 문제
    old/Algorithm 2020. 7. 12. 21:27
    728x90
    #include <string>
    #include <vector>
    #include <map>
    #include <iostream>
    using namespace std;
    
    vector<int> solution(vector<string> words, vector<string> queries) {
        int wl = words.size();
        int ql = queries.size();
        vector<int> answer(ql, 0);
        map<string, vector<int>> f;
        map<string, vector<int>> l;
        map<string, vector<int>> e;
        for(int i = 0; i < ql; i++){
            string qw = queries[i];
            string sqw = to_string(qw.size());
            if(qw[0] != '?'){
                for(int j = 1; j < qw.size(); j++){
                    if(qw[j] == '?'){
                        string temp = qw.substr(0, j);
                        f[temp + sqw].push_back(i); 
                        break;
                    }
                }      
            }else if(qw[qw.size() - 1] != '?'){
                for(int j = 1; j < qw.size(); j++){
                    if(qw[j] != '?'){
                        string temp = qw.substr(j);
                        l[temp + sqw].push_back(i);
                        break;
                    }
                } 
            }else{
                e[sqw].push_back(i);
            }
        }
        
        for(int i = 0; i < words.size(); i++){
            string cur = words[i];
            string scur = to_string(cur.size());
            if(e.count(scur) == 1){
                // for(int j = 0; j < e[scur].size(); j++){
                //     answer[e[scur][j]]++;
                // }
                answer[e[scur][0]]++;
            }
            
            for(int j = 1; j < cur.size(); j++){
                string ff = cur.substr(0, j) + scur;
                if(f.count(ff) == 1){
                    // for(int k = 0; k < f[ff].size(); k++){
                    //     answer[f[ff][k]]++;
                    // }
                    answer[f[ff][0]]++;
                }
                string ll = cur.substr(j) + scur;
                if(l.count(ll) == 1){
                    // for(int k = 0; k < l[ll].size(); k++){
                    //     answer[l[ll][k]]++;
                    // }
                    answer[l[ll][0]]++;
                }    
            }    
        }
        
        for(auto iter = e.begin(); iter != e.end(); iter++){
            vector<int> temp = iter->second;
            if(temp.size() > 1){
                for(int j = 1; j < temp.size(); j++){
                    answer[e[iter->first][j]] = answer[e[iter->first][0]];
                }
            }
        }
        
        for(auto iter = f.begin(); iter != f.end(); iter++){
            vector<int> temp = iter->second;
            if(temp.size() > 1){
                for(int j = 1; j < temp.size(); j++){
                    answer[f[iter->first][j]] = answer[f[iter->first][0]];
                }
            }
        }
        
        for(auto iter = l.begin(); iter != l.end(); iter++){
            vector<int> temp = iter->second;
            if(temp.size() > 1){
                for(int j = 1; j < temp.size(); j++){
                    answer[l[iter->first][j]] = answer[l[iter->first][0]];
                }
            }
        }
        
           
        return answer;
    }

    이건 문제 조건을 잘못봐서 한참 고생했다. 검색 키워드도 중복이 될수가 있다. 

     

    효율성은 좀 문제가 있었는게, 이유가 answer의 값을 매번 증가 시켰기 때문이다. 하나에 대해서만 증가 시키고, 나머지는 그냥 대입해주는게 효율적이다. 

    댓글

Designed by Tistory.