Kakao-オープンチャットルーム


質問する


KakaoTalk公開チャットルームでは友達ではない人とチャットができ、仮想のニックネームでチャットルームに入ることができます.
新入社員のキム・クルーはKakaoTalkの公開チャットルームを開設するため、さまざまな人が入ったり出たりできる管理窓口を作ることにした.誰かがチャットルームに入ると、次のメッセージが出力されます.
【网名】入ってきた
誰かがグループから外に出ると、次のメッセージが印刷されます.
【网名】出て行った
グループ内で名前を変更する方法は2つあります.
  • グループを離れた後、新しいネット名に入ります.
  • チャットルームでニックネームを変更します.
  • ニックネームを変更すると、既存のチャットルームから出力された情報のニックネームもすべて変更されます.
    たとえば、チャットルームでMuziとProdoのニックネームを使用している人が順番に入ると、チャットルームから次のメッセージが出力されます.
    Muziが入ってきた
    Prodoが入ってきた
    もしグループの中の人が外に出たら、グループには次のようなメッセージが表示されます.
    Muziが入ってきた
    Prodoが入ってきた
    Muziは出かけた
    Muziが脱退して再入場した場合、Prodo名義で入場すると、既存のチャットルームのMuziもProdoに変更され、以下のようになります.
    Prodoが入ってきた
    Prodoが入ってきた
    Prodoは出かけました
    Prodoが入ってきた
    チャットルームでは重複したニックネームの使用が許可されているため、現在チャットルームにProdoを使用している人が2人います.2番目にチャットルームに入ったProdoがニックネームをRyanに変更すると、チャットルームの情報は次のように変更されます.
    Prodoが入ってきた
    Ryanが入ってきた
    Prodoは出かけました
    Prodoが入ってきた
    solution関数を完了し、チャットルームを入力または離れると、パラメータがニックネームを変更したレコードを含む文字列配列レコードである場合、すべてのレコード処理が完了すると、最終的に部屋を開いた人が見たメッセージが文字列配列で返されます.

    せいげんじょうけん

  • recordは、1または100000以下の文字列を含む配列です.
  • 以下は、記録中の文字列の説明である.
  • すべてのプレイヤーは[ユーザID]で区別される.
  • [ユーザID]ユーザが[ニックネーム]でチャットルームに入る[ユーザID][ニックネーム](ex.Enteruid 1234 Muzi)
  • [ユーザID]ユーザチャットルームを終了-Lave[ユーザID](ex.Leaveuid 1234)
  • [ユーザID]ユーザニックネームを[ユーザ名][ユーザID](ex.change uid 1234 Muzi)
  • に変更
  • 最初の単語はEnter、Leve、Changeです.
  • 各単語はスペースで区切られており、大文字、小文字、数字のみで構成されています.
  • ユーザーIDとニックネームは、大文字と小文字を区別します.
  • ユーザIDとニックネームの長さは1以上10以下である.
  • 群から出てきたプレイヤーがネット名を変更するなど、誤った入力はしません.
  • に答える


    この問題は文字列の代名詞に分けるだけでいいです.その後、map資料構造にuserIdとニックネームを保存し、EnterChangeとするたびに、そのIDにニックネームを変更することができる.

    コード#コード#

    #include <string>
    #include <vector>
    #include <queue>
    #include <iostream>
    #include <unordered_map>
    
    using namespace std;
    typedef struct {
    	string nickName;
    	string act;
    	string userId;
    }id;
    
    id ft_strtok(string str, char ch) {
    	id tmp;
    	vector<string> strTmp;
    	int start = 0;
    
    	for (int i = 0; i < str.length(); i++) {
    		if (str[i] == ch) {
    			strTmp.push_back(str.substr(start, i - start));
    			start = i + 1;
    		}
    	}
    	strTmp.push_back(str.substr(start, str.length() - start));
    	tmp.act = strTmp[0];
    	tmp.userId = strTmp[1];
    	if (strTmp[0] != "Leave")
    		tmp.nickName = strTmp[2];
    
    	return tmp;
    }
    
    vector<string> solution(vector<string> record) {
    	vector<string> answer;
    	unordered_map<string, string> map;
    	vector<id> tmp;
    
    	for (int i = 0; i < record.size(); i++) {
    		tmp.push_back(ft_strtok(record[i], ' '));
    		if (tmp[i].act == "Enter")
    			map[tmp[i].userId] = tmp[i].nickName;
    		else if (tmp[i].act == "Change")
    			map[tmp[i].userId] = tmp[i].nickName;
    	}
    	for (int i = 0; i < tmp.size(); i++) {
    		if (tmp[i].act == "Enter")
    			answer.push_back(map[tmp[i].userId] + "님이 들어왔습니다.");
    		else if(tmp[i].act == "Leave")
    			answer.push_back(map[tmp[i].userId] + "님이 나갔습니다.");
    	}
    
    	return answer;
    }