2019 KAKAO BLIND RECRUITMENT オープンチャット

https://school.programmers.co.kr/learn/courses/30/lessons/42888

# オープンチャットルーム
カカオトークのオープンチャットルームでは友達ではない人たちと対話ができるが、本来のニックネームではなく仮想のニックネームを使ってチャットルームに入ることができる。

新入社員のキム·クルーはカカオトークオープンチャットルームを開設した人のために、多様な人が入ってきて、出て行くのを見守ることができる管理者ウィンドウを作ることにした。 チャットルームに誰かが入ってくると、次のメッセージが出力される。

「[ニックネーム]様が入ってきました」

チャットルームから誰かが出ると、次のメッセージが出力される。

「[ニックネーム]様が出ました」

チャットルームでニックネームを変更する方法は次の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様が入ってきました」

チャットルームに出入りしたり、ニックネームを変更した記録が含まれた文字列配列レコードがパラメータとして与えられた時、すべての記録が処理された後、最終的に部屋を開設した人が見るメッセージを文字列配列の形でreturnするようにsolution関数を完成させなさい。

# 制限事項
```
- recordは次のような文字列が盛り込まれた配列であり、長さは1 以上 100,000 以下である。
- 次はrecordに含まれた文字列に対する説明だ。
  - すべてのユーザーは「ユーザーID」で区分する。
  - [ユーザーID]ユーザーが [ニックネーム]でチャットルームに入場 - 「Enter [ユーザーID] [ニックネーム]」(ex.「Enteruid1234Muzi」)
  - [ユーザーID]ユーザーがチャットルームから退場。 - 「Leave [ユーザーID]」(ex.「Leave uid1234」)
  - [ユーザーID]ユーザーがニックネームを [ニックネーム]に変更 - "Change [ユーザーID] [ニックネーム]" (ex. "Change uid1234 Muzi")
  - 最初の単語はEnter、Leave、Changeのいずれかである。
  - 各単語は空白に区分されており、アルファベットの大文字、小文字、数字だけで構成されている。
  - ユーザーIDとニックネームはアルファベット大文字、小文字を区別する。
  - ユーザーIDとニックネームの長さは1以上10以下である。
  - チャットルームから出たユーザーがニックネームを変更するなど、間違った入力は与えられない。
```
# 入出力例
```
record
[「Enter uid 1234Muzi」、「Enter uid 4567Prodo」、「Leave uid1234」、「Enter uid1234 Prodo」、「Change uid4567 Ryan」]


 result
 [「Prodo様が入ってきました」、「Ryan様が入ってきました」、「Prodo様が出ました」、「Prodo様が入ってきました」、「Prodo様が入ってきました」]
```

```java

import java.util.ArrayList;
import java.util.HashMap;

class Solution {

    class Pair {
        String active;
        String userInfo;

        Pair(String active, String userInfo) {
            this.active = active;
            this.userInfo = userInfo;
        }
    }


    public String[] solution(String[] record) {

        ArrayList<Pair> arrayList = new ArrayList<>();
        HashMap<String, String> hashMap = new HashMap<>();
        //uid , nickname
        for (String r : record) {

            String[] kodos = r.split(" ");
            if (kodos[0].equals("Enter")) {
                //Enter uid1234 Muzi
                arrayList.add(new Pair("様が入ってきました", kodos[1]));
                hashMap.put(kodos[1], kodos[2]);
            }
            if (kodos[0].equals("Leave")) {
                // Leave uid1234
                arrayList.add(new Pair("様が出ました", kodos[1]));
            }
            if (kodos[0].equals("Change")) {
                // Change uid4567 Ryan
                hashMap.put(kodos[1], kodos[2]);
            }
        }

        String[] answer = new String[arrayList.size()];

        for (int i = 0; i < arrayList.size(); i++) {
             answer[i] = hashMap.get(arrayList.get(i).userInfo) + arrayList.get(i).active;
        }
        return answer;
    }

}
```