알고리즘/프로그래머스

201004 완주하지 못한 선수(C++)

쭈친 2020. 10. 10. 15:49

programmers.co.kr/learn/courses/30/lessons/42576

 

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

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

programmers.co.kr

문제:

입력 값으로 participant 배열과 completion 배열이 주어집니다. 

정답은 completion 배열에 없는 participant 값을 출력하는 것입니다.

completion은 participant 배열보다 find 함수를 사용하고, 크기도 1만큼 작다고 정해져 있어서 쉬운 문제라고 생각했습니다. 

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

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 < completion.size(); i++){
        if(participant[i] != completion[i])
            return participant[i];
        
    }
    return participant[participant.size() - 1];

}

코드:

두 벡터를 정렬 해서 값을 비교합니다. 두 값이 다를 때 participant의 이름을 정답으로 저장합니다.

if로 분기해서 answer에 저장하고 마지막에 answer를 리턴하면 효율성 0점과 정확성 10점을 받습니다.

그래서 마지막에 null 값을 확인하는 if 분기와 answer 저장을 지우고 답을 바로 리턴 했습니다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------

풀고 나니까 해시를 사용하는 문제란걸 알았습니다. 해시를 이용했다면 이름을 인덱스로 사용해서 이름의 유무에 따라 값을 다르게 줘서 마지막에 해당 인덱스를 주면 될 것 같습니다.