앞 내용 생략
채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열record
가 매개 변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.
- record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
- 다음은 record에 담긴 문자열에 대한 설명이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디][닉네임]" (ex. "Enter uid1234 Muzi")
- [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
- [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디][닉네임]" (ex. "Change uid1234 Muzi")
- 첫 단어는
Enter
,Leave
,Change
중 하나이다.- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
- 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못된 입력은 주어지지 않는다.
record | result |
---|---|
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] | ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."] |
import java.util.*;
class Solution {
public String[] solution(String[] record) {
String [] answer;
int count = 0, index = -1;
HashMap<String, String> user = new HashMap<>();
for(int i = 0; i < record.length; i++){
String [] info = record[i].split("\\s");
if(info[0].equals("Enter")){
count++;
user.put(info[1], info[2]);
} else if(info[0].equals("Leave"))
count++;
else if(info[0].equals("Change"))
user.replace(info[1], info[2]);
}
answer = new String[count];
for(int i = 0; i < record.length; i++){
String [] info = record[i].split("\\s");
if(user.containsKey(info[1])){
if(info[0].equals("Enter")) {
answer[++index] = user.get(info[1]) + "님이 들어왔습니다.";
} else if(info[0].equals("Leave")) {
answer[++index] = user.get(info[1]) + "님이 나갔습니다.";
}
}
}
return answer;
}
}
💡 key가 유저 아이디고
value
가 유저 이름인 HashMap을 생성해 주고 공백을 기준으로record
의 원소를 분리시켜 주어 배열info
에 상태, 유저 아이디 닉네임 순으로 넣어 준다 채팅방에 출력되는 메시지는 들어왔을 때랑 나갈 때밖에 없으므로,Enter
이거나Leave
일 때count
를 1씩 올려 주게 된다 상태가Enter
일 때는 해시맵에 정보를 저장해 주고Change
일 때는 새로운 닉네임으로value
를 바꿔 준다
💡 이후
count
크기 만큼의answer
배열을 만들고 다시record
길이 만큼 반복문을 실행시키는데, 만약 해시맵에 저장되어 있는 키가info[1]
과 같다면 해당 유저 아이디가 해시맵에 저장되어 있는 것을 뜻하고, 이때 상태가Enter
라면 들어왔다는 메시지 출력을answer
에 넣어 주고,Leave
라면 나갔다는 메시지 출력을answer
에 넣어 준다
더 참신하게 풀 수도 있을 것 같은데 뭔가 빙빙 먼 길 돌아간 느낌... 😂