c++ 코딩 테스트(해시)

프로그래머스라는 사이트에서 제시된 문제를 풀어봤다. C++을 제대로 배운 적이 없어 고생했지만, 인터넷에 샘플이 많이 나와서 문제를 풀 수 있었다.

첫번째 문제

참고사이트

처음에는 제시된 문제에 벡터가 있어서 벡터를 이용해 풀었는데, 사이트를 확인해 보니 해쉬를 배우기 위한 문제였기에 다시 해쉬를 이용해서 풀었다. C++컴파일러가 PC에 설치되어 있지 않아도 괜챦다. 위의 코드실행기 사이트를 통해 실행하고 결과를 확인할 수 있다.

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {    
    string answer = "";
    
    map<string, int> m;
    map<string, int>::iterator i;
    
    for (string s:participant) {
        i = m.find(s);
        if (i != m.end()) {            
            m[s] = m[s] + 1;
        } else {
            m[s] = 1;
        }
    }
    
        
    for (string s:completion) {
        m[s] = m[s] - 1;
    }
              
    for(i = m.begin(); i != m.end(); i++){
        //cout << "[" << i->first << "] " << i->second << endl;
        if (i->second > 0) answer = i->first;
    }
    
    return answer;    
}

int main() {
    vector<string> participant = {"mislav", "stanko", "mislav", "ana"};
    vector<string> completion = {"stanko", "ana", "mislav"};
    
    string answer = solution(participant, completion);
    cout << answer << endl;
    
}

벡터를 이용해서 문제를 풀려면 조금 복잡하다.

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {    
    string answer = "";
    
    for(std::vector<string>::iterator iter1 = participant.begin(); iter1 != participant.end(); ){
        for(std::vector<string>::iterator iter2 = completion.begin();iter2 != completion.end(); ){
            cout << *iter1 << "\t" << *iter2;
            if((*iter1) == (*iter2)) {
                iter1 = participant.erase(iter1);
                iter2 = completion.erase(iter2);
                --iter1;
                break;
            } else {
                ++iter2;
            }
        }
        ++iter1;
    }

    cout << "\nanswer:" << endl;
    for (string s:participant) {
        cout << s << endl;        
    }
    return answer;    
}

int main() {
    vector<string> participant = {"mislav", "stanko", "mislav", "ana"};
    vector<string> completion = {"stanko", "ana", "mislav"};
    
    solution(participant, completion);    
}

두번째 문제

#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <cstring>

using namespace std;

bool solution(vector<string> phone_book) {
    bool answer = true;
    map<string, int> m;
    map<string, int>::iterator i;
    map<string, int>::iterator j;
    int lower = 0;
    for (string s:phone_book) {
        m[s] = s.length();
    }

    for(i = m.begin(); i != m.end(); i++){ 
        j = i;
        ++j;
        if (j != m.end()) { 
            if (!strncmp((i->first).c_str(), (j->first).c_str(), i->second)) {
                answer = false;
            }
        }
    }
    return answer;
}

int main() {
    //vector<string> phone_book = {"119", "97674223", "1195524421"};
    vector<string> phone_book = {"123", "456", "789"};
    bool bRet = solution(phone_book);
    cout << "answer : " << bRet << endl;
}

 

 

 

 

 

 

 

세번째 문제

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






using namespace std;

int solution(vector<vector> clothes) {
    int answer = 1;
    map<string, int> m;
    map<string, int>::iterator it;
    /*
    for (vector vec : clothes) {
        for (string str: vec) { 
            std::cout << str << "\t";
        }
        std::cout << "\n";
    }
    */
    string s;
    for (vector vec : clothes) {
        s = vec[1];
        it = m.find(s);
        if (it != m.end()) { 
            m[s] = m[s] + 1;
        } else {
            m[s] = 2;
        }
    }
    for(it = m.begin(); it != m.end(); it++){
        answer = answer * it->second;
    }
    answer = answer - 1;
    
    return answer;
}
int main()
{
    //[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]]
    //[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]]
    vector<vector> clothes(30, vector(2, ""));
    //clothes = {{"yellow_hat", "headgear"}, {"blue_sunglasses", "eyewear"}, {"green_turban", "headgear"}};
    clothes = {{"crow_mask", "face"}, {"blue_sunglasses", "face"}, {"smoky_makeup", "face"}};
    int answer = solution(clothes);
    std::cout << "answer = " << answer << endl;
}

 

 

 

 

 

 

나의 답을 입력하고 다른 사람의 답을 봤는데, 나와 비슷하지만 코드가 너무 깔끔해서 여기에 적어본다. 해쉬를 이용하면서 정작 해쉬의 특성을 이용하지 않고 코딩한 셈이다. ㅎㅎ

int solution(vector<vector> clothes) {
    int answer = 1;

    unordered_map <string, int> attributes;
    for(int i = 0; i < clothes.size(); i++) 
        attributes[clothes[i][1]]++; 
    for(auto it = attributes.begin(); it != attributes.end(); it++) 
        answer *= (it->second+1);
    answer--;

    return answer;
}

 

네번째 문제

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <tuple>

using namespace std;

vector solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> m;
    map<string, int>::iterator it;
    map<int, string, greater> mr;
    map<int, string, greater>::iterator itr;
    
    vector< tuple <int,string, int> > vPlays;
    
    for (int i = 0; i < genres.size() ; i ++) { m[genres[i]] += plays[i]; vPlays.emplace_back(make_tuple(i, genres[i], plays[i])); } for (it=m.begin() ; it != m.end() ; it ++) { mr[it->second] = it->first;
    }
    sort(vPlays.begin(), vPlays.end(),
            [](const tuple<int, string, int>& lhs, const tuple<int, string, int>& rhs) {
             return get<2>(lhs) > get<2>(rhs); } );
    
    
    for (itr=mr.begin() ; itr != mr.end() ; itr ++) {
        int jcnt = 0;
        for (tuple<int, string, int> element : vPlays) {
            if (get<1>(element).compare(itr->second) == 0) {
                answer.push_back(get<0>(element));
                jcnt ++;
                if (jcnt > 1) break;
            }
        }
        
    }   
    
    return answer;
}
int main()
{
    vector<string> genres = {"classic", "pop", "classic", "classic", "pop", "classic"};
    vector<int> plays = {500, 600, 150, 800, 2500, 800};
    vector<int> answer;
    answer = solution(genres, plays);
    for (int i : answer) {
        cout << i << " ";
    }
}

 

다른 사람이 푼 답을 봤는데, 내가 하고 싶었던 방식이였다. C++문법에 익숙하지 못해 그방법을 못 찾았다. 장르별로 배열을 선언해서 저장하고 해당 장르에서 다시 정렬을 이용한 방식으로 사용했다.

unordered_map<string, vector<pair<int, int>>> genmap;

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.