개발공부/Programmers

[프로그래머스/C++] Level1 _ 완주하지 못한 선수

예슬예 2022. 7. 6. 17:00

<해시>

 

-문제는 더보기에 있어요.-

더보기

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

제한사항
  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.


<접근 방식>

제일 처음 문제를 풀었을 때는 해시를 적용하지 않았다. participant 과 completion 을 정렬할 후 비교하여 둘의 데이터가 달라지는 지점의 이름을 뽑아 return하였다.

 

하지만 이후에 Hash 문제 탭에 있는 것을 알게되었고.. hash를 적용하여 풀면 속도가 더 빨라질 듯 하여 다시 풀어보았다.

우선 completion을 for문으로 돌며 hash map인 mp에 각 이름에 해당하는 데이터를 -1로 만들어주었다. unordered_map은 원래 없던 데이터여도 그냥 mp[a] = b; 작성해주면 알아서 mp[a]가 0으로 초기화 된 후 (int일 경우) 값이 들어간다.

 

이후 participant을 for문으로 돌면서 해당 이름에 대한 mp의 값에 +1을 해주었다. 완주를 했다면 그 선수의 data에는 원래 -1이 들어있었을 것이므로 해당 for문을 지난 후 0이 들어가야 한다. (동명이인이 아닌 경우)

동명이인이 있을 경우에도 해당 선수들이 모두 완주를 했다면 for문 지난 후 0이어야 맞다. 만약 completion에 이름이 없었다면 ( 완주를 못했다면) 해당 for문을 지난 후 0이 아닌 양수의 값이 들어가있을 것이다. 그래서 1을 더해주고 그 값이 0보다 크다면 바로 그 data의 이름을 return 하도록 하였다.

 

<문제 풀이>

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    unordered_map<string, int> mp;
    for(auto c : completion){
        mp[c]--;
    }
    for(auto p : participant){
        mp[p]++;
        if(mp[p]>0) return p;
    }

}

 


<문제 후기>

다른 사람들의 풀이를 보니 정말 다양한 방법으로 풀리는 문제였다. set을 이용한 사람도 있었고 원래 내가 했던 방법대로 hash를 쓰지 않고 sort 이후 비교하는 방식으로 푼 사람도 있었다. 그래도 확실히 hash로 푸니 속도가 정말 빨랐다.