https://school.programmers.co.kr/learn/courses/30/lessons/42888
import java.util.*;
class Solution {
public String[] solution(String[] record) {
List<String> msg = new ArrayList<>();
HashMap<String, String> user = new HashMap<>();
// map으로 uid 및 이름 저장
// 바꾸면 전부 바뀜
// Enter uid -> 입장
// Leave uid -> 퇴장
// Change -> uid 닉네임 변경
for(int i=0;i<record.length;i++){
String[] s = record[i].split(" ");
switch(s[0]){
case "Enter":
// 입장
user.put(s[1], s[2]);
msg.add(s[1]+" 님이 들어왔습니다.");
break;
case "Leave":
// 퇴장
msg.add(s[1]+" 님이 나갔습니다.");
break;
case "Change":
// 이름 변경
// uid가 없는데 이름 변경하는 경우도 있나?
user.replace(s[1],s[2]);
break;
}
}
String[] answer = new String[msg.size()];
int i = 0;
for(String s : msg){
String[] key = s.split(" ",2); // 2개로 나누겠다는 의미
answer[i++] = user.get(key[0])+key[1];
}
return answer;
}
}
==
public String[] solution(String[] record) {
// Enter, Leave 에 대한 메시지
HashMap<String, String> msg = new HashMap<>();
msg.put("Enter", "님이 들어왔습니다.");
msg.put("Leave", "님이 나갔습니다.");
// uid, 닉네임 관리 <= 닉네임이 변경되면 덮어쓴다. (최신화, 현행화)
// record 를 하나씩 확인하면서 uid, 닉네임이 변경되는 항목 (Enter, Change) 을 처리
// 최종적인 답 ( 채팅 메시지 ) 는 Enter, Leave 로 구성되는 데, 현재 최종 닉네임을 사용해서 만들어야 한다.
// 이걸 위해서 미리 uid 에 최종적인 닉네임을 관리
HashMap<String, String> uid = new HashMap<>();
for (String s : record) {
String[] cmd = s.split(" "); // "Enter uid1234 Muzi" => {"Enter", "uid1234", "Muzi"}
if( cmd.length == 3 ) { // Enter, Change
uid.put(cmd[1], cmd[2]);
}
}
// 정답을 위한 자료구조 List
ArrayList<String> answer = new ArrayList<>();
for (String s : record) {
String[] cmd = s.split(" "); // "Enter uid1234 Muzi" => {"Enter", "uid1234", "Muzi"}
if( msg.containsKey( cmd[0]) ) {
answer.add( uid.get( cmd[1] ) + msg.get( cmd[0] ));
}
}
return answer.toArray(new String[0]);
}
=>
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;
// uid 고정된 값, 닉네임은 변경 <= key, value 로 관리하는 HashMap 자료구조
// 채팅 메시지에는 변경 부분은 없다. 들어오고, 나가는 것만 관리
// 교재 풀이는 메시지 구조를 HashMap 으로 관리 (X)
// for each : for (String s : record) { <= 내부적으로 Iterator 객체가 생성이 되어서 이 객체가 순회를 담당
// 배열의 크기가 크면 index 기반이 더 빠른다.
// StringTokenizer
// split() 대신 맨 앞글자 비교
public class Solution{
public static void main(String[] args) {
String[] r = {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
new Solution_오픈채팅방2().solution(r);
}
public String[] solution(String[] record) {
// uid, 닉네임 관리 <= 닉네임이 변경되면 덮어쓴다. (최신화, 현행화)
// record 를 하나씩 확인하면서 uid, 닉네임이 변경되는 항목 (Enter, Change) 을 처리
// 최종적인 답 ( 채팅 메시지 ) 는 Enter, Leave 로 구성되는 데, 현재 최종 닉네임을 사용해서 만들어야 한다.
// 이걸 위해서 미리 uid 에 최종적인 닉네임을 관리
HashMap<String, String> uid = new HashMap<>();
for (int i = 0; i < record.length; i++) {
char first = record[i].charAt(0); // 맨 앞글자
if( first == 'E' || first == 'C' ) {
StringTokenizer st = new StringTokenizer(record[i]);
st.nextToken();
uid.put(st.nextToken(), st.nextToken());
}
}
// StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < record.length; i++) {
char first = record[i].charAt(0); // 맨 앞글자
if( first == 'E' || first == 'L' ) {
StringTokenizer st = new StringTokenizer(record[i]);
st.nextToken();
sb.append( uid.get(st.nextToken())).append( first == 'E' ? "님이 들어왔습니다.," : "님이 나갔습니다.,");
}
}
sb.setLength(sb.length() - 1); // 마지막 , 제거
return sb.toString().split(",");
}
}