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

12143 ワード

問題を理解する


N文字列が与えられます.
したがって、文字列は3つの方法で入力されます.
1.Enter+アイデンティティ+名前
2.Leave+Id
3.変更+アイデンティティ+名前
Enterフレーズが入力されている場合は「{名前}」、{名前}、Leaveフレーズが入力されている場合は「{名前}」です.出力が必要です.
Changeフレーズが入力されている場合は、IDに格納されているすべての名前を変更する必要があります.EnterまたはLeaveフレーズが事前に入力されている場合は、その文の名前も変更する必要があります.
また、同じidを持つEnter文を2回以上入力すると、入力したすべての文が出力されますが、名前は最後に入力したEnter文にすべて変更する必要があります.
最終出力の構文を返します

問題を解く


問題は理解しにくいので、問題をよく理解すれば簡単です.
Enter文がN回繰り返される場合は最後の名前に置き換え、IDに対応する名前をChangeで変更する場合はそのID Enterで保留中の出力文の名前を変更すればよい.
すなわち,IDは変わらないが名前は変化しており,自然にMap資料構造を使えばよい.
Key値をID,mapとして指定します.各Change文およびEnter文にput({id},{name})を使用すると、idが存在する場合は名前が変更され、存在しない場合は新しいidが追加されます.
(IDはないが変更されないという制約があるので、この方法で問題ありません)
したがって、「外出中」のように文を作成するのではなく、「外出中」のように文を作成してからマッピングします.get({id})によって最終的にそのidの値として保存された名前値をインポートして文を生成すればよい

コード#コード#

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        Map<String, String> id = new HashMap<>();
		Queue<String> queue = new LinkedList<>();
        
        for(int i =0;i<record.length;i++){
            String[] str = record[i].split(" ");
            
            if(str.length==3){
            // Enter구문이나 Change구문
            // Map에 ID와 대응하는 이름을 넣어준다.
                id.put(str[1], str[2]);
                if(!str[0].equals("Change")){
                /*
                Change일 경우 문구가 출력되지 않는다.
                Queue는 최종적으로 출력될 문구에 관련된 자료구조이므로, 
                Change일 때는 이 메서드가 수행되서는 안된다
                */
                    queue.add(str[1]);
                    queue.add(str[0]);
                }
            }
            else{
                queue.add(str[1]);
                queue.add(str[0]);
            }
            // queue에 저장된 str[1] : ID, str[0] : Enter나 Leave

        }
        
        ArrayList<String> sb = new ArrayList<>();
        while(!queue.isEmpty()){
            String who = queue.poll();
            // ID값이 Pop된다(str[1], 즉 ID값을 먼저 넣었으므로 FIFO 구조에
            // 의해 ID 값이 먼저 반환된다)
            String in = queue.poll();
            // 해당 ID값이 수행하는 행동(Enter나 Leave)가 출력될 것이다
            
            if(in.equals("Enter")){
            // Enter Case
            // Map에서 id에 대응하는 이름을 꺼내온 뒤 들어왔습니다 문구에 추가
                sb.add(id.get(who)+"님이 들어왔습니다.");
            }
            else{
            // Leave Case
                sb.add(id.get(who)+"님이 나갔습니다.");
            }
        }
        
        return sb.toArray(new String[sb.size()]);

    }
}

結果