https://school.programmers.co.kr/learn/courses/30/lessons/42888
두개의 자료구조를 사용했다.
입장/퇴장을 누적하는 리스트와,
uid-닉네임을 매칭하는 해시맵 이다.
입장/퇴장인 경우(닉네임 변경이 아닌 경우) 해당 정보를 리스트에 누적하고,
입장/닉네임 변경인 경우 해시맵에 담긴 닉네임을 갱신해준다.
import java.util.*;
import java.util.stream.*;
class Solution {
public String[] solution(String[] record) {
final List<Info> infos = new ArrayList(record.length);
final Map<String, String> infoMap = new HashMap<>();
for(String rec : record) {
String[] split = rec.split(" ");
Action action = Action.valueOf(split[0]);
String uid = split[1];
Info info = new Info(action, uid);
if (action != Action.Change) {
infos.add(info);
}
if (action != Action.Leave) {
infoMap.put(uid, split[2]);
}
}
return infos.stream()
.map(info -> info.toMsg(infoMap.get(info.uid)))
.toArray(String[]::new);
}
enum Action {
Enter, Leave, Change;
}
static class Info {
Action action;
String uid;
public Info(Action action, String uid) {
this.action = action;
this.uid = uid;
}
public String toMsg(String nickname) {
return nickname + "님이 " + (action == Action.Enter ? "들어왔습니다." : "나갔습니다.");
}
}
}