본문 바로가기

알고리즘/프로그래머스

완주하지 못한 선수

반응형




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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());
 
    int answerIdx;
    for(int i = 0, j = 0; i < participant.size(); i++) {
        if(participant[i] == completion[j]) j++;
        else answerIdx = i;
    }
 
    answer = participant[answerIdx];
    return answer;
}
cs



문제 분류가 해시로 되어있지만 해시에 대해서 아직 자세하게 모르기 때문에 알고 있는 벡터에서 정렬을 한다음에 푸는 방식으로 했다.


먼저 문제를 이해해보면 입력으로 마라톤에 참가한 사람들의 명단과 마라톤을 완주한 사람의 명단이 주어진다. 그리고 나서 결과로 출력해야 할 것은 마라톤을 완주하지 못한 사람이다. 문제를 보고나서 떠올린 것이 먼저 vector값이 int일때는 정렬이 가능하단 것을 알고 있는데 string이 주어졌을 때도 가능한가였다. 그래서 검색을 통해서 string에서도 sort가 가능한 것을 알고 sort를 사용해 받은 명단들을 정렬해주었다.

여기서 정렬을 해준 이유는 간단하다. 둘의 명단을 정렬을 해주면 아무리 명단을 뒤죽박죽으로 받아도 완주한 사람과 참가한 사람을 비교하기 편하기 때문이다. 또한 정렬을 해주지 않으면 for문을 한번 더 써서 풀어, 복잡도가 올라갈 것을 예방하기 위함이기도 했다. 


그 이후에 반복문을 어떻게 썼는지 살펴보면 먼저 범위는 참가자의 벡터 사이즈만큼으로 한다. 이유는 참가자들을 모두 비교해보기 위함이다. 반복문을 실행하면서 참가자의 이름과 완주한 사람의 이름이 같다면 완주한 명단의 인덱스를 의미하는 j값을 참가한 명단의 인덱스와 마찬가지로 증가시킨다. 하지만 같지 않다면 j값을 증가시키지 않는다. 그 이유는 지금 가리키고 있는 인덱스 i가 가리키고 있는 사람은 완주한 사람 명단에 없는 것이기 때문이다. 


마지막으로 비교가 끝났으면 answer에 완주하지 못한 사람을 가리키고 있는 인덱스 answerIdx를 이용해서 값을 대입해준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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());
 
    int answerIdx;
    for(int i = 0, j = 0; i < participant.size(); i++) {
        if(participant[i] == completion[j]) j++;
        else {answerIdx = i; break;}
    }
 
    answer = participant[answerIdx];
    return answer;
}
cs

나중에 생각해보니 이렇게도 가능하다. 이 전 코드와 달라진 점은 else 문에 break를 하나 넣어준 것이다. break를 넣어준 이유는 어짜피 완주 목록에 없는 사람이 발견되었으니 반복문을 종료해도 상관이 없다라는 의미에서 넣어주었다.



'알고리즘 > 프로그래머스' 카테고리의 다른 글

프린터  (0) 2018.10.24
H-Index  (0) 2018.10.24
쇠막대기  (0) 2018.10.22
기능개발  (0) 2018.10.20
모의고사  (0) 2018.10.14