
User 클래스를 만들고 HashSet에 저장해서 풀려고 했는데, 이렇게 하면 userId로 검색해서 User 객체를 가져오는 것이 번거로워졌다. 그래서 HashMap에 저장하고 검색해서 최종 userName을 가져오도록 수정하였다.
records를 차례로 탐색하면서 Enter와 Change인 경우 users에 userId와 userName을 저장한다.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+"님이 나갔습니다.");
}
}