Algorithm
[프로그래머스] 완주하지 못한 선수 (C++)
Mirab
2021. 4. 30. 21:16
풀이
문제 요약.
1. 단 한 명의 선수를 제외하고 나머지 모든 선수들은 완주를 했다.
2. 선수들의 수는 10만
간단하게 생각하면 참가자와 완주자를 2중 포문으로 모두 대조해서 찾을 수 있지만
10만 X 10만은 시간 초과가 발생할 수 있다.
따라서 더 간단하게 대조하는 방법은 map 자료구조를 사용하는 것이다.
map의 특징 중 하나인 검색의 속도가 O(lgN)을 보장하기 때문에 N이 10만이 들어온다 하더라도
무리 없이 해결할 수 있다.
우선 참가자들을 순회하면서 해당 선수 이름의 횟수를 늘려준다.
그리고 완주자들을 순회하면서 해당 선수 이름의 횟수를 빼준다.
만약에 해당 선수의 이름을 조회하였을 때 그 선수의 값이 0이 아닌 다른 숫자라면?
그 선수는 완주하지 못한 이름이다. 따라서 그 이름을 리턴하면 끝.
#include <string>
#include <vector>
#include <map>
using namespace std;
string solution(vector<string> participant, vector<string> completion) {
string answer = "";
map<string, int> m;
for(int i = 0; i < participant.size(); i++) {
string name = participant[i];
m[name]++;
}
for(int i = 0; i < completion.size(); i++) {
string name = completion[i];
m[name]--;
}
for(auto p : m) {
if(p.second > 0) {
answer = p.first;
break;
}
}
return answer;
}