Problem Solving/프로그래머스

[프로그래머스/c++] 완주하지 못한 선수

세고래 2021. 6. 13. 16:47

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

 

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

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

programmers.co.kr


1) 풀이

요즘 프로그래머스를 열심히 푸는 중인데,

이것도 이 형식에 적응하다보니 좀 풀만한 것 같기도 하고...

그치만 백준을 너무 오래도록 풀어서 아직까지 어색한 감은 있다..

 

아무튼, 위 문제는 단순히 생각하면 오히려 쉽게 풀리는 문제이다.

처음에는 참여자 배열의 값들을 반복문으로 하나씩 find함수에 넣고,

해당 값이 completion 배열에 있는지를 확인해주었다.

find() 함수에서 completion.end() 를 가르키면, 해당 participant 값을 answer에 넣는 형식으로..

당연히 테스트 케이스는 전부 통과됐지만, 이 방법은 효율적인 면에서 빵점을 맞았다😂

 

그래서 진짜 단순하게 participant와 completion을 sort 함수로 정렬해주고,

각각의 배열의 동일한 인덱스에 들어있는 값을 비교하여 값이 다르거나, 

completion 배열의 사이즈를 넘어선 경우(completion 배열의 값이 하나 덜 들어있다)

해당 participant 배열의 값을 answer에 넣어주는 방식으로 수정했다!

 

이렇게 해서 테스트 케이스를 돌리는데, 분명 논리적으로 맞는데도 계속해서 마지막 tc가 값이 틀리더라...

이유는, 내가 몽총하게도 answer에 답을 넣는 과정에서 break 를 해주지 않아,

다음 인덱스로 넘어가 answer의 답을 계속 바꾸게 두었던 것...! 

 

처음으로 answer에 값이 들어갈 때 break 해주지 않으면,

completion의 값이 하나 적기 때문에 완주를 했음에도..

인덱스로 비교하기 때문에 ..값이 다르다고 나온다,,!

그래서 answer의 값을 갈아치우기 때문에 break는 필수! 

2) 최종 소스코드
#include <string>
#include <vector>
#include <iostream>
#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(i>=completion.size()||participant[i]!=completion[i]){ //completion 크기를 넘어가거나, 비교해서 값이 다를때
        answer=participant[i];
        break; 
    }
    }
    return answer;
}
3) 참고자료

 

728x90