본문 바로가기

Algorithm/Programers - C++

[프로그래머스] 해시1-완주하지 못한 선수

문제

풀이

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    int i;
    unordered_map<string , int> hash;
    
    for(i=0; i<participant.size(); i++){
        if(hash.count(participant.at(i))==0)
            hash.insert(make_pair(participant.at(i), 1));
        else {
            hash[participant.at(i)] = hash[participant.at(i)]+1;
        }
    }
    
    for(i=0; i<completion.size(); i++){
        hash[completion.at(i)] = hash[completion.at(i)]-1;
    }
    
    for(i=0; i<participant.size(); i++){
        
        if(hash[participant.at(i)]>0)
            return participant.at(i);
    }
    
    return " ";
}

 

string자료형의 개수를 파악하는 문제.

 

해결과정

1. participant의 데이터를 key값으로 설정하고 value를 갯수로 설정.

2. completion의 데이터와 key가 일치하는 value의 갯수를 1씩 줄이기.

3. value가 0이 아닌것이 정답.

 

for문을 3개나 썼기 때문에... 더 효율적인 방법을 찾아봐야겠다.

 

 

 


 

 

 

다른사람풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());
    for(int i=0;i<completion.size();i++)
    {
        if(participant[i] != completion[i])
            return participant[i];
    }
    return participant[participant.size() - 1];
    //return answer;
}

해시를 이용한 탐색은 아니지만

각 배열을 sort로 정렬한후 비교하는 방법이 있었다.

 

반복문도 비교문도 하나씩만있어서 내가쓴코드보다 훨씬 효율적인것같다.

나는 너무 1차원적으로 코드를 짜는 듯 하다...

코테 공부하면서 효율적으로 코딩하는 법을 익혀야겠다.

 

 

 


 

 

hash_와 unirdered_의 차이

출처 : https://eocoding.tistory.com/6

 

hash_map | unordered_map | map 차이 비교, 특징 정리 - C++

hash_와 unordered_에 대하여 hash라는 말이 붙지 않은 map,set은 자료를 정렬해서 저장합니다. (key를 기준으로 오름차순 정렬) 따라서 순회할 때도 저장된 데이터를 넣은 순서대로가 아닌 자동정렬된

eocoding.tistory.com

 

unirdered_map

출처 : https://umbum.tistory.com/744

 

[C++] 맵 : unordered_map (hash_map)

find와 count로 exist 체크 내부에 해당 key가 존재하는지는 ``c count()/find()``를 사용한다. 중복을 허용하지 않는 자료구조에서 둘은 내부적으로 거의 똑같기 때문에, 취향 대로 사용하면 된다. ```cpp #in

umbum.dev