문제 (level2, 2019 KAKAO BLIND RECRUITMENT)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
사용자를 실제로 구별하는 것은 [유저 아이디] 입니다.
따라서 답을 내는데 필요한 것은, (유저 아이디, 닉네임) 이 짝지어서 필요합니다.
이 경우, C++의 map을 사용하는 것이 이상적이라고 생각해서 사용했습니다.
key값으로 유저아이디를,
value값에 해당 유저의 닉네임을 저장하기로 합니다.
map<string,string> mname;
for(int i=0; i<record.size(); i++)
{
if(record[i][0]=='E') //Enter인 경우
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
mname[uid]=nick_name; //최신으로 이름으로 업뎃
}
else if(record[i][0]=='C') //Change인 경우
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
mname[uid]=nick_name; //최신으로 이름으로 업뎃
}
}
참고로 record는 문제에서 주어지는 인자입니다. (vector<string> record 형태로 주어집니다.)
map<string,string> mname; 에다가 (유저아이디=key,닉네임=value) 형태로 저장합니다.
record의 처음부터 끝까지 for문으로 탐색하면서
시작이 'E'라면 Enter~~~ 문장이기 때문에 닉네임이 바뀌었든 안바뀌었든 간에 업데이트를 해줍니다.
(닉네임이 변경되었나 여부를 확인하는게 오히려 더 시간적 손해가 크기 때문에 Enter때마다 해줌)
시작이 'C'라면 Change~~~문장이기 때문에 닉네임을 업데이트 해줍니다.
vector<string> aws;
for(int i=0; i<record.size(); i++)
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
if(record[i][0]=='E')
{
string str=mname[uid]+"님이 들어왔습니다.";
aws.push_back(str);
}
else if(record[i][0]=='L')
{
string str=mname[uid]+"님이 나갔습니다.";
aws.push_back(str);
}
}
return aws;
앞에서 (유저아이디,닉네임)의 최신 정보를 지닌 mname을 구했습니다. (map<string,string> mname;)
이제 벡터형태로 완전한 문장으로 바꿔서 저장해준 다음에 return만 해주면 됩니다.
시작이 'E'라면 Enter~~~ 문장이기 때문에 닉네임(mname[uid])+님이 들어왔습니다. 를 push_back해줍니다.
시작이 'L'이라면 Leave~~~문장이기 때문에 닉네임(mname[uid])+님이 나갔습니다. 를 push_back 해줍니다.
시작이 'C'인 경우는 표시하지 않기때문에 (닉네임을 바꾼건 내부적으로 이루어짐) 무시해줍니다.
그리고 완성된 vector<string>aws를 return 해주면 끝나게 됩니다.
#include <string>
#include <map>
#include <vector>
using namespace std;
vector<string> solution(vector<string> record) {
map<string,string> mname;
for(int i=0; i<record.size(); i++)
{
if(record[i][0]=='E') //Enter인 경우
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
mname[uid]=nick_name; //최신으로 이름으로 업뎃
}
else if(record[i][0]=='C') //Change인 경우
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
mname[uid]=nick_name; //최신으로 이름으로 업뎃
}
}
vector<string> aws;
for(int i=0; i<record.size(); i++)
{
int uid_start_pos=record[i].find(" ")+1;
int uid_end_pos=record[i].find(" ",uid_start_pos);
string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
if(record[i][0]=='E')
{
string str=mname[uid]+"님이 들어왔습니다.";
aws.push_back(str);
}
else if(record[i][0]=='L')
{
string str=mname[uid]+"님이 나갔습니다.";
aws.push_back(str);
}
}
return aws;
}
최종코드입니다.
주의 사항
제가 처음에 문제를 이해를 제대로 하지 못해서 애먹었던 부분인데,
저는 유저 아이디가 uid~~~형식으로 고정돼있는줄 알았습니다.
그러나 zxcv23같처럼 아무 형식이나 가능한 것으로 생각하고 문제를 풀어야 합니다.
즉, 띄어쓰기를 기준으로 유저아이디를 찾아야합니다.
'알고리즘 > 프로그래머스 문제풀이' 카테고리의 다른 글
[C++] 멀쩡한 사각형 (Lv.2) (0) | 2022.08.30 |
---|---|
[C++] 단체사진 찍기 (Lv.2) (0) | 2022.08.29 |
[C++] 카카오 프렌즈 컬러링북 (Lv.2) (0) | 2022.08.28 |
[C++] 문자열 압축 (Lv.2) (0) | 2022.08.24 |
[C++] 프로그래머스-두 큐 합 같게 만들기 (Lv.2) (0) | 2022.08.21 |