💬 IDEA
unordered_map
을 사용하기로 한다unordered_map<string, string> user
: Key값은 ID, Value는 닉네임
👩💻Solution
record
에 저장된 문자열을 입력받아str[]
에 차례대로(Enter/Leave/Change), (ID), (닉네임)
을 저장한다
str[0]
에 저장된 문자에 따라 연산을 수행한다
모든 연산은 순서대로 이루어지므로answer
에는 들어오거나 나가는 ID를,state
에 나갈때는 "님이 나갔습니다", 들어올 때는 "님이 들어왔습니다"를 차례대로 넣어준다ⓐ Enter: ID에 닉네임을 저장해주고,
answer
에는 현재 ID를,state
에는 "님이 들어왔습니다"라는 상태 메시지를 넣어준다user[str[1]]=str[2]; answer.push_back(str[1]); state.push_back("님이 들어왔습니다.");
ⓑ Leave:
answer
에는 현재 ID를,state
에는 "님이 나갔습니다"라는 상태 메시지를 넣어준다answer.push_back(str[1]); state.push_back("님이 나갔습니다.");
ⓒ Change: ID에 저장된 값에 바꿀 닉네임을 저장해준다
user[str[1]]=str[2];
answer
에 저장된ID
의 값에 해당하는닉네임(value)
+state
를 차례대로 출력해준다
코드
#include <string> #include <vector> #include <sstream> #include <unordered_map> using namespace std; vector<string> solution(vector<string> record) { vector<string> answer, state; unordered_map<string, string> user; for (int i=0; i<record.size(); i++) { string str[3]; string stream; stringstream ss(record[i]); int idx=0; while (ss>>stream) str[idx++]=stream; if (str[0]=="Enter") { user[str[1]]=str[2]; answer.push_back(str[1]); state.push_back("님이 들어왔습니다."); } else if (str[0]=="Leave") { answer.push_back(str[1]); state.push_back("님이 나갔습니다."); } else if (str[0]=="Change") { user[str[1]]=str[2]; } } for (int i=0; i<answer.size(); i++) answer[i]=user[answer[i]]+state[i]; return answer; }
✍️ stringstream 사용법과 strtok
#include <sstream>
을 먼저 include 한다
기본적으로 stringstream
은 주어진 문자열에서 필요한 자료형
에 맞는 문자열을 꺼낼 때 사용한다 (공백, \n 문자열 제외)
다음과 같은 예시가 있을 때, while (ss1>> num1)
이 의미하는 것은 ss1
에 받아온 문자열 "1D2S#10S"
에서 num1
의 자료형 int
형이 아닐 때까지 문자열을 꺼낸다. 즉, 1
만 출력된다
string str1 = "1D2S#10S";
stringstream ss1(str1);
int num1,
while (ss1 >> num1) cout << num1 << endl;
num
은 float
형 이므로 25, 1, 3, 0.235
가 차례대로 출력되고 그 후에 \n
문자를 제외한 1111111, 222222
도 차례대로 출력된다float num;
stringstream stream1;
string string1 = "25 1 3 .235\n1111111\n222222";
stream1.str(string1);
while( stream1 >> num ) cout << "num: " << num << endl;
stringstream
을 쓰지 않고 싶을 때는 다음과 같이 공백이 나오기 이전 문자까지 차례대로 저장해주는 방법도 있다for(int i=0;i<s.length();i++){
if(s[i]==' '){
actionIdName.push_back(s.substr(start,i-start));
start=i+1;
}
}