[コードテスト練習]オープンチャットルーム


-質問


[問題リンク]
solution関数を完了し、チャットルームを入力または離れると、パラメータがニックネームを変更したレコードを含む文字列配列レコードである場合、すべてのレコード処理が完了すると、最終的に部屋を開いた人が見たメッセージが文字列配列で返されます.
  • 制限
  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
    다음은 record에 담긴 문자열에 대한 설명이다.
    - 모든 유저는 [유저 아이디]로 구분한다.
    - [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
    - [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
    - [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
    - 첫 단어는 Enter, Leave, Change 중 하나이다.
    - 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
    - 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    - 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    - 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
  • I/O例
  • -完全なコード

    import java.util.*;
    
    class Solution {
        public String[] solution(String[] record) {
            String[] answer = {};
            List<String> answerList = new ArrayList<>();
            HashMap<String, String> userMap = new HashMap<>(); // 유저 아이디는 고유 값이므로 HashMap의 key로 저장하기 적절하며, 닉네임은 value로 저장하면된다.
            
            for(String s : record) {
                String[] temp = s.split(" ");
                // 채팅방 입장 혹은 닉네임 변경일 경우 userMap에 추가하거나 새로운 value 값으로 업데이트한다.
                if(temp[0].equals("Enter")||temp[0].equals("Change")) {
                    userMap.put(temp[1],temp[2]);
                }
            }
            
            for(String s : record) {
                String[] temp = s.split(" ");
                // 입장시와 퇴장시 유저 아이디를 통해 userMap에서 닉네임에 해당하는 value를 가져온다.
                if(temp[0].equals("Enter")) {
                    answerList.add(userMap.get(temp[1])+"님이 들어왔습니다.");
                }
                else if(temp[0].equals("Leave")) {
                    answerList.add(userMap.get(temp[1])+"님이 나갔습니다.");
                }
            }
            
            // ArrayList를 배열로 변경
            answer = new String[answerList.size()];
            int i = 0;
            for(String s : answerList) {
                answer[i++] = s;
            }
            
            return answer;
        }
    }

    -詰まった場所&解決策

  • のユーザIDおよびニックネームを格納するために最初に使用されたオブジェクト.Profileという名前のオブジェクトを使用してオブジェクトリストを作成する方法.サンプルとテストに25回合格したが、テスト26回からタイムアウトに失敗した.まず,ユーザIDはオブジェクトリストにおいて対応する値の位置を見つけ,オブジェクトリストにおける対応する位置の値からニックネームに対応する値を再取得するため,ニックネームにアクセスするのに長い時間がかかると考えられる.オブジェクトリストではなく、より良いデータセット形式を検索すると、KeyとValueのペアからなるMapが見つかりました.[参考文献]校が資料構造の授業で使用したHashMapは,ユーザIDをキー値としてニックネームを値として記憶し,関数を再修正することで問題を解決している.[参考文献]
  • -感じる


    私が初めて思いついたオブジェクトリストを使って作成した関数と、HashMapで作成した関数を使ったテスト1~25回の間の実行時間の差は大きくありませんが、26回から時間の差が大きく、リストとMapの違いを考えさせられました.使用するデータセットがどのような形式がより有利であるかを考慮すると,問題の中で適切な形式を選択することの重要性を認識する.この問題はHashMapを使用することですが、最も高速なHashSetの方が運転時間の短縮に役立つと思います.