문제 설명
상세한 문제 설명은 프로그래머스에서 확인할 수 있습니다.
카카오톡 오픈채팅방에서 채팅방에 입장 / 퇴장 메시지 출력을 구현하는 문제입니다.
이미 출력된 메시지에 표시된 닉네임은 기존 사용자가 닉네임을 변경할 때 전부 변경됩니다.
"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Muzi님이 나갔습니다."
위 상황에서 Muzi가 나간 후에, Prodo라는 닉네임으로 다시 들어올 경우 기존 채팅방에 남아있던 메시지의 Muzi도 Prodo로 변경됩니다.
닉네임의 중복은 허용하기 때문에 표시되는 닉네임은 겹칠 수 있습니다.
"Prodo님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."
이 때, 기존의 Prodo 닉네임을 사용하던 사용자가 Ryan으로 변경하면 아래와 같이 메시지가 변경됩니다.
"Prodo님이 들어왔습니다."
"Ryan님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."
입장 / 퇴장 / 닉네임 변경에 담긴 채팅방 로그 배열 record가 주어지면 채팅방에 출력되는 메시지 배열을 출력하세요.
제한 사항
- 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님이 들어왔습니다."] |
풀이
사용자 식별자가 입력 데이터에서 주어지므로 Map을 사용하여 닉네임을 관리하면 됩니다.
이때, 나간 사용자의 닉네임도 보관해야 함을 주의합니다.
코드
import java.util.*;
class Solution {
public String[] solution(String[] record) {
List<String> answer = new ArrayList<>();
// 사용자의 닉네임을 관리하기 위해 Map을 사용합니다.
Map<String, String> nickname = new HashMap<>();
for (String r : record) {
String[] s = r.split(" ");
// 들어오거나 변경되는 경우에만 반영하고 나간 경우는 유지시킵니다.
if (s[0].equals("Enter") || s[0].equals("Change")) {
nickname.put(s[1], s[2]);
}
}
for (String r : record) {
String[] s = r.split(" ");
if (s[0].equals("Enter")) {
answer.add(nickname.get(s[1]) + "님이 들어왔습니다.");
} else if (s[0].equals("Leave")) {
answer.add(nickname.get(s[1]) + "님이 나갔습니다.");
}
}
return answer.toArray(String[]::new);
}
}
'개발 > Algorithm' 카테고리의 다른 글
[Java] 다음 큰 숫자 (Programmers, Level 2) (0) | 2023.07.18 |
---|---|
[Java] 영어 끝말잇기 (프로그래머스 Summer/Winter Coding(~2018)) (0) | 2023.06.26 |
[Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP) (0) | 2023.06.26 |
[Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십) (0) | 2023.06.26 |
[Java] 백준 2178번: 미로 탐색 (0) | 2023.01.05 |