オープンチャットルーム


ステップ2


問題の説明


  • KakaoTalk公開チャットルームでは友達ではない人とチャットができ、仮想のニックネームでチャットルームに入ることができます.

  • 新入社員のキム・クルーはKakaoTalkの公開チャットルームを開設するため、さまざまな人が入ったり出たりできる管理窓口を作ることにした.誰かがチャットルームに入ると、次のメッセージが出力されます.
    「ニックネームが入ってきた」

  • 誰かがグループから外に出ると、次のメッセージが印刷されます.
    [ニックネーム]出て行った

  • グループ内で名前を変更する方法は2つあります.
    1)チャットルームを出て、新しいニックネームに入ります.
    2)チャットルームでニックネームを変更する.
    ニックネームを変更すると、既存のチャットルームから出力された情報のニックネームもすべて変更されます.
    たとえば、チャットルームで「Muzi」と「Prodo」のニックネームを使用している人が順番に入ると、チャットルームから次のメッセージが出力されます.
    「ムジが入ってきた」
    「Prodoが入ってきた」

  • もしグループの中の人が外に出たら、グループには次のようなメッセージが表示されます.
    「ムジが入ってきた」
    「Prodoが入ってきた」
    「ムジは出て行った」

  • Muziが脱退して再入場した場合、Prodo名義で入場すると、既存のチャットルームのMuziもProdoに変更され、以下のようになります.
    「Prodoが入ってきた」
    「Prodoが入ってきた」
    「Prodoが出てきた」
    「Prodoが入ってきた」

  • チャットルームでは重複したニックネームの使用が許可されているため、現在チャットルームにProdoを使用している人が2人います.2番目にチャットルームに入ったProdoがニックネームをRyanに変更すると、チャットルームの情報は次のように変更されます.
    「Prodoが入ってきた」
    「Ryanが入ってきた」
    「Prodoが出てきた」
    「Prodoが入ってきた」

  • solution関数を完了し、チャットルームを入力または離れると、パラメータがニックネームを変更したレコードを含む文字列配列レコードである場合、すべてのレコード処理が完了すると、最終的に部屋を開いた人が見たメッセージが文字列配列で返されます.
  • import java.util.*;
    import java.util.stream.*;
    
    class Solution {
        public String[] solution(String[] record) {
            ArrayList<String> ment = new ArrayList<>(); // 메시지를 저장할 리스트
            ArrayList<String> user = new ArrayList<>(); // 사용자들의 id를 저장할 리스트
            ArrayList<String> answer = new ArrayList<>(); // 완성된 메시지를 기록할 리스트
            Map<String, String> map = new HashMap<>(); // 사용자의 최신 닉네임을 저장하기 위한 맵
            
            for (int i = 0; i < record.length; i++) {
                String[] temp = record[i].split(" ");
                
                if (temp.length != 2) 
                    map.put(temp[1], temp[2]);
                
                if (!temp[0].equals("Change"))
                    user.add(temp[1]);
                
                if (temp[0].equals("Enter"))
                    ment.add("님이 들어왔습니다.");
                else if (temp[0].equals("Leave"))
                    ment.add("님이 나갔습니다.");
            }
            
            for (int i = 0; i < ment.size(); i++) {
                answer.add(map.get(user.get(i)) + ment.get(i));
            }
            
            return answer.toArray(new String[0]);
        }
    }
    基本的な方法は次のとおりです.
    1)ユーザの固有値idを順番に格納する.
    2)ユーザの動作を順番に記憶する.このとき保存される値は、後のメッセージ(ex.)です.
    3)ユーザの最新のニックネームを保持するためにHashMap(id,ニックネーム)に保存する.
    4)idとメッセージを保存順に出力する.このときidは最新のニックネームに変更されます.
    .😣