[2019 카카오 블라인드] 오픈채팅방 (JAVA)

Jiwoo Kim·2021년 3월 4일
0
post-thumbnail

문제


풀이

User 클래스를 만들고 HashSet에 저장해서 풀려고 했는데, 이렇게 하면 userId로 검색해서 User 객체를 가져오는 것이 번거로워졌다. 그래서 HashMap에 저장하고 검색해서 최종 userName을 가져오도록 수정하였다.

  1. records를 차례로 탐색하면서 Enter와 Change인 경우 usersuserIduserName을 저장한다.
  2. records를 다시 차례로 탐색하면서 Enter와 Leave인 경우 해당 userName을 찾아 messages를 작성해서 저장한다.

코드

import java.util.*;

class Solution {
        
    private static final String ENTER = "Enter";
    private static final String LEAVE = "Leave";
    private static final String CHANGE = "Change";

    private List<String> messages = new ArrayList<>();
    private Map<String, String> users = new HashMap<>();

    public String[] solution(String[] records) {
        getUsersFromRecords(records);
        writeMessages(records);
        return messages.toArray(new String[0]);
    }

    private void getUsersFromRecords(String[] records) {
        for (String record : records)
            parseLine(record);
    }

    private void parseLine(String record) {
        StringTokenizer tk = new StringTokenizer(record);
        switch (tk.nextToken()) {
            case ENTER, CHANGE -> addUser(tk);
        }
    }

    private void addUser(StringTokenizer tk) {
        String userId = tk.nextToken();
        String userName = tk.nextToken();
        users.put(userId, userName);
    }

    private void writeMessages(String[] records) {
        for (String record : records)
            writeMessage(record);
    }

    private void writeMessage(String record) {
        StringTokenizer tk = new StringTokenizer(record);
        switch (tk.nextToken()) {
            case ENTER -> writeEnter(tk.nextToken());
            case LEAVE -> writeLeave(tk.nextToken());
        }
    }

    private void writeEnter(String userId) {
        String userName = users.get(userId);
        messages.add(userName+"님이 들어왔습니다.");
    }

    private void writeLeave(String userId) {
        String userName = users.get(userId);
        messages.add(userName+"님이 나갔습니다.");
    }
}

0개의 댓글