매일 하나의 문제는 풀어서 올리기로 다짐한게 벌써 2일전이지만(??)
4월 21일이 지난지 아직 1시간 23분밖에 되지 않았으니 아무튼 봐주십시오!
코드부터보시죠! 가아니라...
문제부터 보시죠!
이 문제는 기억에 남는것이, 작년 제가 사제동행세미나라고 교수님께서 추천해주시는 코딩문제를 풀어오는 교과목이 있었습니다. 물론 작년의 저는 안일! 안배! 아이몰라귀찮아!의 자세로 풀지않고 눈으로만 슥 훑고갔던 기억이 있습니다...만!(그 당시의 전 CPP의 C자만 아는 상태였습니다.)
사람은 성장한다고 했던가요.....
CPP의 수련을 통해! 오늘 이 문제를 풀었습니다요!
정말로, 코드를 보시죠!
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <iostream>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;//답을 저장할 곳
unordered_map<string,string> um;//uid의 변화 확인을 위한 map
//record 정보를 분석해보자!
for(auto i:record){
//ss로 정보를 나눠받자!
stringstream ss;
ss.str(i);
string order,id,name;
ss>>order>>id>>name;
if(order=="Enter"){
um[id]=name;
answer.emplace_back("님이 들어왔습니다.");
}
else if(order=="Leave"){
answer.emplace_back("님이 나갔습니다.");
}
else{
um[id]=name;
}
}
int j=0;
for(int i=0;i<record.size();i++){
stringstream ss;
ss.str(record[i]);
string order,id,name;
ss>>order>>id>>name;
if(order=="Change"){
continue;
}
else{
answer[j++].insert(0,um[id]);
}
}
return answer;
}
음. 조금 길고 비효율적으로 보이는거 같기도 합니다!
제 실력이 아직은 딱 요정도인 것이겠죠...
아무튼~ 코드 분석을 하면 다음의 순서와 같습니다.
이 정도가 되겠군요!
다시금 요약해보자면, record를 달며 answer을 대충 만들어주고 uid에 따른 닉네임을 확인 갱신작업을 해줍니다. 그리고나면 answer엔 닉네임이 빈 상태로 "님이 들어왔습니다."또는 "님이 나갔습니다." 부분만 남아있겠죠? 이 부분을 두번째 포문에서 채워주는겁니다!
um[id]=name;
이 부분을 주의해야 한다는 점입니다!
for(auto i:record){
//ss로 정보를 나눠받자!
stringstream ss;
ss.str(i);
string order,id,name;
ss>>order>>id>>name;
um[id]=name;
if(order=="Enter"){
answer.emplace_back("님이 들어왔습니다.");
}
else if(order=="Leave"){
answer.emplace_back("님이 나갔습니다.");
}
}
이런식으로 작성해선 안된다는 것이죠. 왜일까요?
사실 간단한 문제입니다.
record에서 "Leave"일 경우는 name없이 uid만 제공한다는 사실입니다!!!!!저만 재밌었나요?
즉 위와 같은 코드로 작성하게 된다면 uid에 존재하지 않는 name이 들어간다는 사실이지요.
유령회원인가요? ㅋㅋ~
설명은 이정도로 마무리 하겠습니다.
다음 문제에서 뵙겠습니다!