bdfgdfg

[레벨1] 완주하지 못한 선수 본문

코딩테스트/프로그래머스

[레벨1] 완주하지 못한 선수

marmelo12 2021. 8. 9. 22:22
반응형
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    unordered_map<string, int> um;
    
    for(string& s : completion)
    {
        auto it = um.find(s);
        if(it != um.end()) // 이미 키가있다 (중복된 이름)
            it->second++;
        else
            um.insert(make_pair<string&,int>(s,1));
    }
    
    for(string& s : participant)
    {
        auto it = um.find(s);
        if(it == um.end() || it->second <= 0)
        {
            answer = s;
            break;    
        }
        else
            it->second--;
    }
    
    return answer;
}

참여 선수가 목록에 있는지 찾는 문제.

 

c++의 해시 맵 컨테이너인 unordered_map을 사용하여 completion(완주한 선수 목록)의 정보를 담고, 만약 키가 중복되는 게 있다면 value값을 ++해준다.

 

그런 다음 참가 목록을 읽어 들이면서 참가 선수 목록에서 만약 해시 맵에 등록된 키가 없다면(이터레이터는 end를 가리킨다) 그 선수가 완주하지 못한 선수이고. 만약 중복된 이름이 있다면 1씩 감소시키면서 0 이하라면 그 선수가 완주하지 못한 선수.

 

이 문제는 unordered_map이나 map 컨테이너를 사용하면 쉽게 풀리는 문제이다.

unordered_map 컨테이너도 map컨테이너처럼 []연산자를 이용해 쉽게 키-value를 저장할 수 있는데(물론 없는 키인데 접근하면 추가해버린다는 것도 기억) 위 문제에선 반복자를 이용해 풀어보았다.

 

다만 한가지 막힌 오류가 있었는데. make_pair의 인수 목록에서 string 변수를 넘길 때, make_pair <string, int>가 아닌

make_pair <string&,으로 명시해야 한다.

 

참고:

https://stackoverflow.com/questions/42853360/make-pair-does-not-work-with-string-works-with-string

반응형

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[레벨1] 문자열 다루기 기본  (0) 2021.08.14
[레벨1] 행렬의 덧셈  (0) 2021.08.13
[레벨1] 모의고사  (0) 2021.08.12
[레벨1] 체육복  (0) 2021.08.10
[레벨1] 숫자 문자열과 영단어  (0) 2021.08.08
Comments