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+"님이 나갔습니다.");
}
}