프로그래머스: 오픈채팅방
import java.util.*;
class Solution {
public String[] solution(String[] record) {
List<String[]> actionDetails = new ArrayList<>();
Map<String, String> uidToNickname = new HashMap<>();
for (String r : record) {
String[] details = r.split(" ");
String action = details[0];
String uid = details[1];
if (!action.equals("Leave")) {
// Enter 또는 Change인 경우, 최신 닉네임으로 업데이트
String nickname = details[2];
uidToNickname.put(uid, nickname);
}
if (!action.equals("Change")) {
// Enter 또는 Leave인 경우, 로그를 기록
actionDetails.add(new String[]{action, uid});
}
}
String[] answer = new String[actionDetails.size()];
for (int i = 0; i < actionDetails.size(); i++) {
String[] details = actionDetails.get(i);
String action = details[0];
String uid = details[1];
String nickname = uidToNickname.get(uid);
if (action.equals("Enter")) {
answer[i] = nickname + "님이 들어왔습니다.";
} else { // Leave인 경우
answer[i] = nickname + "님이 나갔습니다.";
}
}
return answer;
}
public static void main(String[] args) {
Solution sol = new Solution();
String[] record = {
"Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"
};
String[] result = sol.solution(record);
System.out.println(Arrays.toString(result));
}
}
details[] 배열을 보면 공백을 기준으로 저장된다.
{"Enter", "uid1234", "Muzi"}
{"Enter", "uid4567", "Prodo"}
{"Leave", "uid1234"}
{"Enter", "uid1234", "Prodo"}
{"Change", "uid4567", "Ryan"}
1. "Enter uid1234 Muzi",
action에는 Enter가 담긴다.
uid에는 uid1234가 담긴다.
action이 Leave가 아니므로,
nickname에는 Muzi가 담긴다.
해시맵에 "uid1234 " - "Muzi "가 담긴다.
action이 Change가 아니므로,
리스트에 Enter, uid1234가 들어간다.
해시맵:
" uid1234 " - " Muzi "
리스트:
"Enter, uid1234"
2. "Enter uid4567 Prodo",
action에는 Enter가 담긴다.
uid에는 uid4567 가 담긴다.
action이 Leave가 아니므로,
nickname에는 Prodo 가 담긴다.
해시맵에 " uid4567 " - " Prodo "가 담긴다.
action이 Change가 아니므로,
리스트에 Enter, uid4567 가 들어간다.
해시맵:
" uid1234 " - " Muzi "
" uid4567 " - " Prodo "
리스트:
"Enter, uid1234"
"Enter, uid4567"
3. "Leave uid1234",
action에는 Leave 가 담긴다.
uid에는 uid1234 가 담긴다.
action이 Leave가 이므로,
패스.
action이 Change가 아니므로,
리스트에 Leave, uid4567 가 들어간다.
해시맵:
" uid1234 " - " Muzi "
" uid4567 " - " Prodo "
리스트:
"Enter, uid1234"
"Enter, uid4567"
"Leave, uid1234"
4. "Enter uid1234 Prodo",
action에는 Enter가 담긴다.
uid에는 uid1234 가 담긴다.
action이 Leave가 아니므로,
nickname에는 Prodo 가 담긴다.
해시맵에 " uid1234 " - " Prodo "가 담긴다.
action이 Change가 아니므로,
리스트에 Enter, uid1234 가 들어간다.
해시맵:
" uid1234 " - " Muzi "
" uid4567 " - " Prodo "
" uid1234 " - " Prodo "
리스트:
"Enter, uid1234"
"Enter, uid4567"
"Leave, uid1234"
"Enter, uid1234"
5. "Change uid4567 Ryan"
action에는 Change 가 담긴다.
uid에는 uid4567 가 담긴다.
action이 Leave가 아니므로,
nickname에는 Ryan 가 담긴다.
해시맵에 " uid4567 " - " Prodo "가 담긴다.
action이 Change이므로,
패스.
해시맵:
" uid1234 " - " Muzi "
" uid4567 " - " Prodo "
" uid1234 " - " Prodo "
" uid4567 " - " Ryan "
리스트:
"Enter, uid1234"
"Enter, uid4567"
"Leave, uid1234"
"Enter, uid1234"
====메시지 붙여서 answer[] 배열에 담기====
i=0)
detail = [ "Enter", "uid1234" ]
action = Enter,
uid = uid1234,
nickname = Prodo
action이 Enter이므로
"Prodo님이 들어왔습니다."
i=1)
detail = [ "Enter", "uid4567" ]
action = Enter,
uid = uid4567,
nickname = Ryan
action이 Enter이므로
"Ryan님이 들어왔습니다."
i=2)
detail = [ "Leave", "uid1234" ]
action = Leave,
uid = uid4567,
nickname = Prodo
action이 Enter가 아니므로,
"Prodo님이 나갔습니다."
i=3)
detail = [ "Enter, uid1234" ]
action = Enter,
uid = uid1234,
nickname = Prodo
action이 Enter이므로
"Prodo님이 들어왔습니다."
결과:
[Prodo님이 들어왔습니다.,
Ryan님이 들어왔습니다.,
Prodo님이 나갔습니다.,
Prodo님이 들어왔습니다.]