<Programmers> Lv2 string_오픈 채팅방 c++

Google 아니고 Joogle·2022년 3월 8일
0

Kakao Coding Test

목록 보기
1/3
post-thumbnail

Lv2. 오픈 채팅방
참고

💬 IDEA

  • ID는 변하지 않지만, 닉네임은 변할 수 있다.
    따라서 ID를 알면 닉네임을 알 수 있다
    => 여기서 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;
  • 그렇다면 다음과 같은 예시에서 numfloat형 이므로 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;
	}
}
profile
Backend 개발자 지망생

0개의 댓글