[C++] 프로그래머스 완주하지 못한 선수
2020. 10. 25.
반응형

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

 

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

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

programmers.co.kr

1. 서론

 

level 1짜리 간단한 문제이다. 해시로 푸는 문제라는데 난 해시가 뭔지 몰라서 그냥 풀었다... 나중에 공부하고 다시 볼까?

 

2. 문제 풀이

 

마라톤에 출전한 사람 명단이 있다. 그리고 완주한 사람의 명단도 있다. 마라톤은 꼭 한 사람만 완주를 못하며, 그 한 명을 출력하는 문제이다.

그리고 동명이인이 있을 수 있다. 

 

처음에는 플래그를 세워서 풀었다. 마라톤에 출전한 사람과 완주한 사람의 명단을 비교하면서 없는 사람을 추리는 방법이다. 그런데 플래그가 제대로 작동하지도 않았고 동명이인이 있는 경우에는 처리하기 어려웠기 때문에 다른 방법으로 풀었다.

 

이렇게 생각하면 쉽다. 두 명단은 완주 못한 단 한 사람을 빼곤 같은 내용을 담고 있다.

따라서 두 명단을 정렬한 후, 두 명단을 같은 index로 체크하면서 다른 점이 발견되면 바로 멈추고 출력하면 된다.

 

3. 코드 설명

 

#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    int i;
    
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());

    for (i = 0; i < participant.size(); i++)
    {
        if (participant[i] != completion[i])
        {
            answer = participant[i];
            break;
        }
    }
    
    return answer;
}

 

participant는 참가자 명단, completion은 완주자 명단을 나타낸다. 

sort로 두 명단을 정렬 후, 한 바퀴 돌면서 같지 않은 부분을 찾고 answer에 넣어서 return 해주면 된다.

 

이렇게 쉽고 간단한 문제였는데 나는 왜 그렇게 어렵고 복잡하게 생각했을까? 문제를 너무 안 풀어봐서 그런가 보다.

 

 

 

 

 

 

 

 

 

 

 

 

반응형
myoskin