본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 완주하지 못한 참가자] c++ (풀이,코드)

by 말린밴댕이_공부 2023. 7. 9.
반응형

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

코드, 풀이

 

풀이 1

완주자에서 참여자를 뺀 나머지 결국 완주를 못한 사람은 제한사항을 따른 한명뿐이다. 생각을 해보니 그냥 completion에 대해서 먼저 map을 추가하고 키값이 false라면 그걸 리턴하면 되지 않을까?
근데 세번째 예시와 제한사항에 중첩이 있을 수 있다니 int로 선언하고 ++을 해준다. -> 0이라면 return해준다.

#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    map<string,int> m; //참여자와 완주여부
   
    for(int i = 0; i < completion.size();i++){
        m[completion[i]] += 1;
    }
    for(int i = 0; i < participant.size();i++){
        if(m[participant[i]] == 0)
            return participant[i];
        else
            m[participant[i]] -= 1;
    }
}

 

풀이 2

 

먼저 정렬을 해준다 -> 정렬을 한 두개를 같은 인덱스를 통해 비교를 해준다. 근데 여기서 다르게 된다면 결국 완주를 못한 유일한 한명에 대해서 걸러지게 된다.

 

사실 위의 풀이는 여러명일때 사용하기 좋을것 같고 이번 문제처럼 한명일때는 정렬하고 다르면 리턴

 

만약에 completion의 크기까지 같다면 정말 낮은확률로 가장 마지막 participant.size() - 1 인 인덱스가 완주를 못한것이다.

 

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    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];
}
반응형

댓글