알고리즘/프로그래머스

프로그래머스 : 완주하지 못한 선수 - C++

맏리믓 2023. 7. 10. 12:10

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 해석

- participant 배열에서 completion 배열에 있는 사람을 빼고 남은 사람을 return 하면 된다.

- 이때 participant 에는 중복된 사람(동명이인)이 존재 할 수 있다.

- 따라서  동명이인인 경우에 completion에 그 중 한명만 적혀 있다면 나머지 사람은 완주 하지 못한걸로 처리 된다.


알고리즘

- c++ 의 map 을 이용한다.

- participant 의 사람 이름을 key 로 동명이인인 경우 value 를 2, 아닐 경우를 1로 저장 하면 해결하기 편해 진다.

- map 에 저장 후 completion 을 처음부터 끝까지 돌며 다름을 수행한다.

  - map 에서 completion에 나오는 이름의 value 를 1 빼준다.

- 모든 수행이 끝난 후 value 가 0이 아닌 key 를 찾아 주면 된다.


코드

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    unordered_map<string, int> map;

    for(auto player : participant){
        if(map.end() == map.find(player)){
            map.insert(make_pair(player, 1));
        } else {
            map[player] += 1;
        }
    }

    for(auto player : completion){
        map[player] -= 1;
    }

    for(auto player : participant){
        if(map[player] > 0){
            answer = player;
            break;
        }
    }

    return answer;
}