[코딩 테스트] Hashmap > 완주하지 못한 선수

Cassis_Soda·2025년 3월 13일

코딩 테스트

목록 보기
6/13
post-thumbnail

0. 링크

    프로그래머스 문제 링크

1. 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

  • 제한사항
    • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
    • completion의 길이는 participant의 길이보다 1 작습니다.
    • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
    • 가자 중에는 동명이인이 있을 수 있습니다.

입출력 예시

participantcompletionreturn
["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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

2. 해설

  1. 참가자의 이름과 등장 횟수를 기록할 2차원 Hashmap(unordered_map) 선언
  2. 반복문으로 participant의 크기만큼 순회하며 Hashmap에 있는 이름에 1씩 더해준다.
  3. 반복문으로 completion의 크기만큼 순회하며 Hashmap에 있는 이름에 1씩 빼준다.
    3-1. 이 과정에서 participant에는 있지만 completion에는 없는 이름을 거를 수 있다.
  4. map을 순회하면서 1이 남아있다면 그 요소를 리턴

3. 코드

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

using namespace std;

unordered_map<string, int> map;

string solution(vector<string> participant, vector<string> completion) {
    
    //반복문으로 participant 만큼 돌면서 map에 있는 이름에 1씩 더해준다.
    for(size_t i = 0; i < participant.size(); i++)
    {
        map[participant[i]]++;
    }
    // completion에 이름이 있다면, 숫자를 하나 줄여준다.
    for (auto& c : completion)
    {
        map[c]--;
    }
    //map을 순회하면서 1이 남아있다면 그 요소를 리턴
    for(auto& m : map)
    {
        if (m.second == 1)
            return m.first;
    }
    
}

4. 감상

     이전에 python으로 풀어봤었던 문제였다. 접근법은 같았으나, 내 방법이 조금 더 복잡했다. 해결법을 알고 있어서 해설을 이해하는 것이 어렵지 않았다.

0개의 댓글