출석어찌고하면
map
인것 같다. 물론 필자의 뇌피셜.
map
을 써야하는 문제는 느낌이 온다. 이건 맵이다! 하는
본 문제도map
을 활용해서 풀었다.
본 문제는 코드를 잘라서 설명하겠다.
vector<string> answer;
vector<pair<string, string>> v;
map<string, string> data;
vector v
id
와 action
나가고 들어오는 액션을 저장해뒀다.nickname
을 저장하게 되면 안된다. (닉네임은 변화할수 있기 때문.)id
를 저장해줘야 한다.data
는 변화하는 닉네임
을 저장해주기 위해 map
을 사용했다.
for (int i = 0; i < record.size(); i++)
{
string str[3];
string tmp = "";
int idx = 0;
for (int j = 0; j < record[i].size(); j++)
{
if (record[i][j] == ' ')
{
str[idx++] = tmp;
tmp = "";
}
else
tmp += record[i][j];
}
str[idx] = tmp;
if (str[0] == "Enter" || str[0] == "Change")
data[str[1]] = str[2];
if (str[0] == "Enter" || str[0] == "Leave")
v.push_back(make_pair(str[1], str[0]));
}
띄어쓰기에 따라 값을 저장해줬다.Enter
의 경우는 새로 들어온 유저가 있을수 있으므로, map
에 저장해줬고, Change
의 경우는 유저가 닉네임을 바꾼 경우이므로 map
을 갱신시켜줬다.(갱신과 저장은 모두 같은 연산)Enter
와 Leave
의 경우 순서를 저장해줘야하기 때문에 순서저장벡터에 넣어준다. for (int i = 0; i < v.size(); i++)
{
string id = v[i].first;
string tmp = data[id];
if (v[i].second == "Enter")
tmp += "님이 들어왔습니다.";
else if (v[i].second == "Leave")
tmp += "님이 나갔습니다.";
answer.push_back(tmp);
}
Enter
냐 Leave
냐에 따라 문자열을 저장해준다.map[id]
의 연산으로 바뀐 닉네임을 반환해주면 문제 끝.#include <string>
#include <vector>
#include <map>
#include <cstring>
using namespace std;
vector<string> solution(vector<string> record)
{
vector<string> answer;
vector<pair<string, string>> v;
map<string, string> data;
for (int i = 0; i < record.size(); i++)
{
string str[3];
string tmp = "";
int idx = 0;
for (int j = 0; j < record[i].size(); j++)
{
if (record[i][j] == ' ')
{
str[idx++] = tmp;
tmp = "";
}
else
tmp += record[i][j];
}
str[idx] = tmp;
if (str[0] == "Enter" || str[0] == "Change")
data[str[1]] = str[2];
if (str[0] == "Enter" || str[0] == "Leave")
v.push_back(make_pair(str[1], str[0]));
}
for (int i = 0; i < v.size(); i++)
{
string id = v[i].first;
string tmp = data[id];
if (v[i].second == "Enter")
tmp += "님이 들어왔습니다.";
else if (v[i].second == "Leave")
tmp += "님이 나갔습니다.";
answer.push_back(tmp);
}
return answer;
}