본문 바로가기
Algorithm/C++

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

by imagineer_jinny 2021. 9. 11.

코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

 

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 


Key-Value쌍을 기록하는 STL은 map, unordered_map이 있음

둘의 차이는 map은 key에 의한 접근 시간이 O(logN), unordered_map은 O(1)

즉, map이 크면 클수록 key에 의한 접근 시간이 늘어남.

또 새로운 원소 삽입, 삭제할 때 log에 비례하는 시간이 걸림

 

이에 비해 unordered_map은 상수시간에 같은 연산 할 수 있음

이 차이는 라이브러리 내부 구현 방법이 달라서임

바이너리 서치트리를 사용하면 key의 순서에 대한 정보가 유지됨

순서에 따라 원소에 접근하는 것이 가능하지만 원소의 삽입 삭제 검색 등의 해쉬테이블이 갖고 있는 특징인 상수시간 접근이 불가능하고 원소개수의 log에 비례하는 시간이 걸림

 

 

unordered_map을 어떻게 사용하는가?

헤더 인클루드하고, key와 value를 쓰기

key는 string 타입, value는 int 타입


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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    unordered_map<string, int> d;
    
    for(auto& i: participant) d[i]++;
    for(auto& i: completion) d[i]--;
    
    for(auto& i: d)
    {
        if(i.second>0)
        {
            answer=i.first;
            break;
        }
    }
    
    return answer;
}

댓글