문제링크
오픈 채팅방
풀이
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> nickNameMap = new HashMap<>();
ArrayList<String> commandList = new ArrayList<>();
for (String data : record) {
String[] splitData = data.split(" ");
if (splitData[0].equals("Enter") || splitData[0].equals("Change")) {
nickNameMap.put(splitData[1], splitData[2]);
}
if (splitData[0].equals("Enter") || splitData[0].equals("Leave")) {
commandList.add(data);
}
}
String[] answer = new String[commandList.size()];
for (int i = 0; i < commandList.size(); i++) {
String[] splitData = commandList.get(i).split(" ");
answer[i] = nickNameMap.get(splitData[1]) + getMsg(splitData[0]);
}
return answer;
}
public String getMsg(String data) {
if (data.equals("Enter")) {
return "님이 들어왔습니다.";
} else if (data.equals("Leave")) {
return "님이 나갔습니다.";
}
return null;
}
}
소감
- 닉네임 체크용 맵과, 명령어들을 순서대로 넣어두는 commandList 만들었다.
- 이를 통해서 마지막으로 변경되는 닉네임 정보를 수집하고, 명령어들과 uid를 따로 수집하도록 하였다.
- 객체로 풀어볼까 했지만 하나하나 구현하는게 귀찮아서 일단 이렇게 풀었으나...객체로 구현하는게 확장성 면에서는 굉장히 좋아보였다. 귀찮아 하지 말자.. for 문 하나가 사라진다..
- 객체로 푸신 분의 코드를 첨부해두도록 하겠다.
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':
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':
commandList.add(new Command(command.charAt(0), userId));
break;
case 'C':
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()]);
}
}