오늘 풀어볼 문제는...
https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
"마라톤에 참여한 사람들의 명단"과 "마라톤을 완주한 사람들의 명단"이 주어진다. 이를 대조하여, 마라톤을 완주하지 못한 사람을 찾아내라. (단, 마라톤을 완주하지 못한 사람의 수는 언제나 1명이다!)
입출력 예
더보기
participant : ["dana", "anette", "lilith", "dana"]
completion : ["dana", "lilith", "anette"]
이러한 경우에, 미완주자는 "dana"이다. (참고 : 동명이인이 존재할 수 있다!)
풀이
해시맵(unordered_map)을 사용하는 문제이다.
1. "마라톤에 참여한 사람들의 이름"을 해시맵에 추가한 뒤, "마라톤을 완주한 사람들의 이름"을 제거한다.
2. 이때 동명이인이 있을 수 있으므로; 해시맵을 <string, int> 형식으로 만들어야 한다. (이렇게 하는 이유: 이름을 추가할 때는 이를 key로 삼아 +1을, 제거할 때는 -1을 해준 뒤, int 값이 0인 key-value쌍을 해시맵에서 없애버리면 편하기 때문)
3. 마라톤을 완주하지 못한 사람이 한 명뿐이라고 했으므로, 해시맵의 첫 번째 원소를 return한다.
코드
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string solution(vector<string> participant, vector<string> completion)
{
unordered_map<string, int> m;
for (int i = 0; i < participant.size(); i++)
m[participant[i]]++;
for (int i = 0; i < completion.size(); i++)
{
m[completion[i]]--;
if (m[completion[i]] == 0)
m.erase(completion[i]);
}
return m.begin()->first;
}