문제를 읽고, Id값과 닉네임을 보고, HashMap을 사용하면 되겠다는 생각이 들었다. 먼저 record를 읽으면서 유저 아디와 닉네임을 (key,value) 값으로 저장하되 맨 앞 단어가 Enter와 Change일 경우에 add하는 조건을 걸었다. 왜나하면 Leave는 아이디 값만 가지고 있어 닉네임 값이 없기 때문이었다.
위의 과정을 통해 최종 변경된 값만 가지고 있는 고유ID와 닉네임 Map을 얻게 되었고, 다시 한 번 record를 조회하면서 첫 단어를 switch문으로 가져와서 각 경우에 맞는 메시지를 저장하도록 코드를 구성했다.
최종변경된 메시지만 출력하면 되므로 복잡한 과정없이 2번의 record 조회로 문제를 풀 수 있었다.
효율성 측면에서도 record의 최대 길이 * 2 = 200,000번이라서 충분히 시간을 통과할 수 있을 거 같았고, 통과했다.
오랜만에 한번에 푼 문제여서 기분이 좋다.
import java.util.*;
class Solution {
public String[] solution(String[] record) {
String[] answer = {};
// HashMap 1 : record를 읽으면서 유저 아디를 key, 닉네임을 value로 저장.
HashMap<String, String> idToNickname = new HashMap<>();
for (String S : record) {
String[] arr = S.split(" ");
if (arr[0].equals("Enter") || arr[0].equals("Change")) idToNickname.put(arr[1],arr[2]);
}
// record를 읽으며, 기록에 따른 메시지 출력.
ArrayList<String> messages = new ArrayList<>();
for (String S : record) {
String[] arr = S.split(" ");
switch (arr[0]) {
case "Enter": messages.add(idToNickname.get(arr[1]) + "님이 들어왔습니다.");
break;
case "Leave": messages.add(idToNickname.get(arr[1]) + "님이 나갔습니다.");
break;
case "Change": break;
}
}
return messages.toArray(answer);
}
}
- 다른 사람 방법 풀이
자바스럽다라는 말은 코테 문제를 준비하면서 처음 듣게된 말이었다.
밑의 코드는 자바스러운 코드가 아닐까 싶다. 실제 웹 서비스를 구현하기 위해서는 아래와 같은 방법이 쓰여야 하는데, 과연 나는 실제로 아래와 같이 쓸 수 있을까..
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
private static final String ENTER_FORMAT = "%s님이 들어왔습니다.";
private static final String LEAVE_FORMAT = "%s님이 나갔습니다.";
private HashMap<String, UserInfo> userMap = new HashMap<>();
private class UserInfo {
public String userId;
public String nickName;
public UserInfo(String userId, String nickName) {
this.userId = userId;
this.nickName = nickName;
}
}
private class Command {
public char command;
public String userId;
public Command(char command, String userName) {
this.command = command;
this.userId = userName;
}
}
public String[] solution(String[] records) {
ArrayList<Command> commandList = new ArrayList<>();
for (String record : records) {
String[] split = record.split(" ");
String command = split[0];
String userId = split[1];
String nickName = null;
switch(command.charAt(0)) {
case 'E': // Enter
nickName = split[2];
if(userMap.containsKey(userId) == false) {
userMap.put(userId, new UserInfo(userId, nickName));
} else {
userMap.get(userId).nickName = nickName;
}
commandList.add(new Command(command.charAt(0), userId));
break;
case 'L': // Leave
commandList.add(new Command(command.charAt(0), userId));
break;
case 'C': // Change
nickName = split[2];
userMap.get(userId).nickName = nickName;
break;
}
}
return commandList.stream()
.map(cmd -> String.format( cmd.command == 'E' ? ENTER_FORMAT : LEAVE_FORMAT , userMap.get(cmd.userId).nickName))
.toArray(ary -> new String[commandList.size()]);
}
}