완주하지 못한 선수

NJW·2021년 8월 27일
0

코테

목록 보기
81/170

들어가는 말

완주하지 못한 선수를 찾는 문제이다. 다만, 배열이 정렬되어 있지 않다는 점을 생각해야 한다.

코드 설명

참가자와 완주자의 배열을 정렬해준다. 그리고 하나씩 비교를 하다 보면, 서로 다른 값이 나오는 순간이 있을 것이다. 참가자 중에 완주를 못한 사람이 있다는 의미이니 그 참가자를 반환해주면 된다.

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());
    
    for(int i=0; i<participant.size(); i++){
        if(participant[i] != completion[i]){
            answer = participant[i];
            break;
        }
    }
    return answer;
}

P.s

사실 이 문제는 해시에 포함되어 있는 문제였다. 해시란 임의의 데이터를 고정된 값으로 변환시키는 함수를 의미한다. 예를 들어 모의고사에서 i를 배열의 길이만큼 나눠주는(배열의 길이가 8이라면 나머지는 0애서부터 7만 나오니까) 것도 해시라고 할 수 있다.
다만, 나는 이 문제 전에는 해시를 어떻게 다루는지 몰라 sort로 풀어주었다. 해시로 푸는 법을 찾아보니 일단 <unordered_map>이라는 해쉬맵을 포함시켜야 한다는 것을 알았다. 해시 맵은 개념에서 따로 설명하겠다.
https://mungto.tistory.com/193
위 블로그에 나온 해시를 이용한 풀이를 보면, 먼저 unordered_map<string, int> temp;로 해시 맵 temp를 생성한 것을 알 수 있다. key값의 자료형은 문자열이고 완주 여부를 아는 슬롯의 자료형은 int형이다.
다음에 for문으로 참가자들에게 모두 1을 할당해 준다.

for(string name : participant)
{
   temp[name]++;
}

해시 테이블에서 name이라는 key값을 갖는 슬롯에 1을 더해주라는 의미이다.

unordered_map<string, int> scores;
scores["a"] = 10;
scores["b"] = 20;
scores["c"] = 30;

위의 의미는 해시 테이블 scores의 key 값 a에 10을, key 값 b에 20을, key 값 c에 30을 넣어주라는 의미이다.
다음으로 완주한 사람들 만큼 돌려주면서 값을 감소한다.
마지막으로 temp만큼 돌려주는데, 해쉬 테이블의 두 번째 값이 0보다 크면 이는 완주를 못한 것이니 답에 첫 번째 값(key)를 넣어준다.

for(auto pair : temp)
{
  if(pair.second > 0)
    {
      answer = pair.first;
      break;
    }
  }
}

프로그래머스를 풀면 풀수록 새롭게 알게 되는 것들이 생기는 거 같다. 처음에는 문제를 맞추는 것에 집중했다면, 점점 새로운 지식과 문제가 요구하는 것에 대해 생각하게 된다. 문론 문제를 맞추는 것도 중요하겠지만.

profile
https://jiwonna52.tistory.com/

0개의 댓글