백준 번호 제목
문제 설명
- 카카오톡 오픈 채팅방에 들어오거나, 나가거나, 닉네임을 변경한 기록이 담긴 문자열이 주어진다.
- 해당 문자열을 바탕으로 최종적으로 방을 개설한 사람이 보게 되는 문자열을 배열 형태로 return하라.
- 닉네임을 변경하는 방법은 두 가지이다.
1. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
2. 채팅방에서 닉네임을 변경한다.
입력 값
- record는 문자열이 담긴 배열이며, 길이는 1이상 100,000 이하이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장하는 경우
"Enter [유저 아이디] [닉네임]" (ex. Enter uid1234 Muzi)
- [유저 아이디] 사용자가 채팅방에서 퇴장하는 경우
"Leave [유저 아이디]" (ex. Leave uid1234)
- [유저 아이디] 사용자가 닉네임을 [닉네임] 으로 변경
"Change [유저 아이디] [닉네임]" (ex. Change uid1234 Muzi)
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져 있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1이상 10이하이다.
- 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
예제
문제 분석
- 이 문제의 핵심은 닉네임 변경이다.
- 사용자가 입장하고 퇴장하는 부분은 고정이 되어 있기 때문에,
해당 아이디의 유저가 마지막으로 어떠한 닉네임을 가지고 있는가를 저장해야 한다.
- HashMap을 이용하여 Key는 아이디, Value는 닉네임으로 저장한다.
- 닉네임이 변경되는 경우 Value값을 변경한다.
- 최종적으로 입장, 퇴장을 출력시 닉네임은 HashMap에 저장되어 있는 값으로 출력하면 된다.
소스 코드
import java.util.*;
class Solution {
public final String ENTER = "Enter";
public final String LEAVE = "Leave";
public final String CHANGE = "Change";
Map<String, String> idToNickNameMap = new HashMap<>();
public String[] solution(String[] record) {
List<User> userRecords = new ArrayList<>();
for(String s : record){
StringTokenizer st = new StringTokenizer(s);
String input = st.nextToken();
String id = st.nextToken();
if(ENTER.equals(input) || CHANGE.equals(input)){
String nickname = st.nextToken();
idToNickNameMap.put(id,nickname);
}
userRecords.add(new User(id,input));
}
return userRecords.stream()
.filter(User::isNotChange)
.map(User::toString)
.toArray(String[]::new);
}
public class User{
String id;
String input;
public User(String id, String input) {
this.id = id;
this.input = input;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(idToNickNameMap.get(id));
sb.append("님이 ");
if(ENTER.equals(input)){
sb.append("들어왔습니다.");
}
else if(LEAVE.equals(input)){
sb.append("나갔습니다.");
}
return sb.toString();
}
public boolean isNotChange(){
if(CHANGE.equals(input)){
return false;
}
return true;
}
}
}
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
[BOJ-20544] 공룡게임(Java) (0) | 2022.02.04 |
---|---|
[BOJ-20366] 같이 눈사람 만들래?(Java) (0) | 2022.02.03 |
[BOJ-5719] 거의 최단 경로(Java) (0) | 2022.02.01 |
[BOJ-1202] 보석 도둑(JAVA) (0) | 2022.01.27 |
[BOJ-10159] 저울(JAVA) (0) | 2022.01.22 |
댓글