완주하지 못한 선수
https://programmers.co.kr/learn/courses/30/lessons/42576
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
문제
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
입출력
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
코드
sort를 이용한 방법
//프로그래머스 완주하지못한선수 sort
#include <string>
#include <algorithm>
#include <vector>
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])
return participant[i];
}
return participant[participant.size() - 1];
}
int main() {
vector<string> a = { "marina", "josipa", "nikola", "vinko", "filipa" };
vector<string> b = { "josipa", "filipa", "marina", "nikola" };
cout << solution(a, b) << endl;
return 0;
}
해시 맵을 이용한 방법(unordered_map)
#include <vector>
#include <string>
#include <unordered_map>
#include <iostream>
using namespace std;
string solution(vector<string> participant, vector<string> completion) {
string answer = "";
unordered_map<string, int> m;
for (auto name : participant){
m[name]++;
}
for (auto name : completion){
m[name]--;
}
for (auto elem : m)
{
if (elem.second > 0){
answer = elem.first;
break;
}
}
return answer;
}
int main() {
vector<string> a = { "marina", "josipa", "nikola", "vinko", "filipa" };
vector<string> b = { "josipa", "filipa", "marina", "nikola" };
cout << solution(a, b) << endl;
return 0;
}
설명
이번 문제는 두가지 방법을 사용하여 해결할 수 있다.
- sort를 이용한 방법
- 해시 맵을 이용한 방법(unordered_map)
sort를 이용한 방법은 algorithm 헤더를 이용하여 participant, completion을 정렬하여 비교하여 다른 값을 출력한다.
해시맵을 이용한 방법은 unordered_map 헤더를 선언하여 구현할 수 있다. participant는 m을 증가시키고 completion은 m을 감소 시킨다. m에 남아있는 하나의 name이 완주하지 못한 선수의 이름이므로 출력할 수 있다.
고찰
이번 문제를 풀면서 unordered_map대해서 새롭게 알 수 있었다. 해시라는 것이 무엇인지 알 수 있었고 효율성을 위해서 unordered_map을 사용해야한다. 처음 for문을 이용하여 문제를 풀었었는데 효율성을 통과하지 못하였다. 간단한 문제도 STL을 사용하도록 노력해야할 거 같다.
해쉬 맵은 2021.06.26 - [알고리즘] - 알고리즘 / unorderd_map 에서 자세하게 설명해두었다
난이도
level 1
'알고리즘 > 프로그래머스' 카테고리의 다른 글
알고리즘(C++) / 프로그래머스 level 2 : 캐시 (0) | 2021.07.13 |
---|---|
알고리즘(C++) / 프로그래머스 level 2 : 스킬 트리 (0) | 2021.07.13 |
알고리즘(C++) / 프로그래머스 level 2 : 가장 큰 정사각형 찾기 (0) | 2021.07.11 |
알고리즘(C++) / 프로그래머스 level 2 : 압축 (0) | 2021.07.11 |
알고리즘(C++) / 프로그래머스 level 1 : 키패드 누르기 (0) | 2021.06.27 |
댓글