프로그래머스의 완주하지 못한 선수(Lv1) 문제이다.

 

[ 문제풀이 ]

마라톤에 참가하는 선수 이름 리스트와, 완주한 선수 이름 리스트가 주어졌을 때, 완주하지 못한 1명의 선수를 찾아야 하는 문제이다.

 

문자열로 주어지는 선수들의 이름과 해당 이름을 가진 선수가 몇 명있는지를 (동명이인이 존재하므로) 관리해 주기 위해서 자료구조 map을 사용해주었다.

map<string , int> 형식으로, key값을 string형태로, value 값을 int형으로 선언해 주었다.

key값으로는 선수들의 이름이 들어가고, value값으로는 해당 이름을 가진 선수의 수가 들어가도록 설정해 주었다.

여기서 중요한 것은 ! 이 map에 저장하는 데이터는 "완주한 선수의 리스트" 라는 것이다.

이 부분을 코드로 확인한 후에 조금 더 구체적인 이야기를 해보자.

map<string, int> MAP;

void Make_Map(vector<string> completion)
{
   for(int i = 0 ; i < completion.size(); i++)
   {
       string Str = completion[i];
       MAP[Str]++;
   }
}

위와 같이, 구현해 주었다.

예시를 한번 들어보자.

참가자 : [ A , B , A , C , D ] , 완주자 : [ A , D , A , B ] 가 있다고 가정해보자.

이 때, 완주자들을 map저장을 하게 되면 다음과 같아질 것이다.

MAP[A] = 2 , MAP[B] = 1 , MAP[D] = 1 이 될 것이다.

즉, 완주하지 못한 'C'선수 만이, MAP[C]의 값이 '0'이라는 것을 알 수 있다.

 

위와 같이 저장을 했다면, 해당 이름을 가진 선수의 수를 한명씩 감소 시키면서 완주하지 못한 선수를 찾으면 된다.

만약, 감소시키기 전에 이미 '0'의 값을 가진 선수라면, 이 선수가 완주를 하지 못한 것이라 판단할 수 있다.

이 부분을 코드로 나타내면 다음과 같다.

string Find_Answer(vector<string> V)
{
    for(int i = 0 ; i < V.size(); i++)
    {
        string Str = V[i];
        if(MAP[Str] == 0) return Str;
        MAP[Str]--;
    }
}

 

[ 소스코드 ]

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
32
33
#include <string>
#include <vector>
#include <map>
using namespace std;
 
map<stringint> MAP;
 
void Make_Map(vector<string> completion)
{
   for(int i = 0 ; i < completion.size(); i++)
   {
       string Str = completion[i];
       MAP[Str]++;
   }
}
 
string Find_Answer(vector<string> V)
{
    for(int i = 0 ; i < V.size(); i++)
    {
        string Str = V[i];
        if(MAP[Str] == 0return Str;
        MAP[Str]--;
    }
}
 
string solution(vector<string> participant, vector<string> completion) 
{
    string answer = "";
    Make_Map(completion); 
    answer = Find_Answer(participant);
    return answer;
}
cs

 

+ Recent posts