Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Study, 2022

[C++/해시] 완주하지 못한 선수 본문

코딩 문제 풀이

[C++/해시] 완주하지 못한 선수

JIonI 2021. 12. 16. 10:52

문제 출처

프로그래머스 https://programmers.co.kr/learn/courses/30/lessons/42576

 

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다..

 

이전 문제 풀이

https://think-deeply.tistory.com/4?category=934880 

 

[해시/C++] 완주하지 못한 선수

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

think-deeply.tistory.com

 


코드 & 풀이 설명

이전 풀이에서는 해시맵을 사용해 푸는 것에 초점을 맞춰 문제를 풀었다. 문제 풀이 시간을 더 줄이기 위해 정렬된 리스트 2개를 비교하는 방법을 사용했다.

#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());
    
    for(int i=0; i<completion.size(); i++) {
        if(participant[i] != completion[i]){
            answer = participant[i];
            break;
        }
    }
    
    if (answer.size()<1)
        answer = participant.back();
    
    return answer;
}
정확성 테스트
테스트 1 〉 통과 (0.01ms, 4.33MB)
테스트 2 〉 통과 (0.02ms, 4.27MB)
테스트 3 〉 통과 (0.27ms, 3.84MB)
테스트 4 〉 통과 (0.70ms, 4.21MB)
테스트 5 〉 통과 (0.73ms, 4.26MB)
효율성 테스트
테스트 1 〉 통과 (36.99ms, 14.3MB)
테스트 2 〉 통과 (56.20ms, 19.7MB)
테스트 3 〉 통과 (62.90ms, 23.2MB)
테스트 4 〉 통과 (77.46ms, 25.4MB)
테스트 5 〉 통과 (68.54ms, 25.2MB)

 

sort() 함수사용 O(n log n)

입력 배열 completion 의 사이즈만큼만 반복문 O(n)  

O(n log n) + O(n) => O(n log n) 의 시간 복잡도를 가진다.

 

설명

1. 벡터 정렬

#include <algorithm>
sort(vector.begin(), vector.end(), sort_function);

정렬 후 리턴값을 할당할 벡터 선언 필요 없이, 한 줄로 정렬해서 해당 벡터 범위(여기선 vector.begin(), vector.end())에 저장되는 방식

 

2. 벡터 처음/마지막 값

vector_name.front();
vector_name.back();

벡터의 첫 번째(front) 값과 마지막(back) 값을 참조

 

 

'코딩 문제 풀이' 카테고리의 다른 글

[C++/해시] 위장  (0) 2021.12.17
[C++/해시] 전화번호 목록  (0) 2021.12.16
[C++] 프로그래머스 실패율 / 2019 KAKAO BLIND RECRUITMENT  (0) 2021.12.10
[완전탐색] 카펫  (0) 2020.09.02
[스택-큐/C++] 기능개발  (0) 2020.08.06
Comments