엄지월드

오픈채팅방 java 본문

알고리즘

오픈채팅방 java

킨글 2022. 9. 3. 21:13

 

문제 해석

1. Enter uid1234 Muzi가 있으면 "Muzi님이 들어왔습니다."를 result 메시지에 저장해준다.

2. Leave uid1234가 있으면 "Muzi님이 나갔습니다."를 result 메시지에 저장해준다. 

3. Change uid1234 Prodo가 있으면 reuslt 메시지에 있던 Muzi를 모두 Prodo로 바꿔준다.

Ex "Muzi님이 들어왔습니다." -----> "Prodo님이 들어왔습니다."

즉, 채팅 로그가 있을 때에 닉네임을 변경하게 되면 이전에 채팅 로그들에 있던 닉네임까지 모두 변경이 된다. 

 

문제 풀이

1. uidToName이라는 HashMap을 운영하여 주어진 record에서 uid와 name을 모두 저장해준다.

if(st.hasMoreElements()) {
    name = st.nextToken();
    uidToNameMap.put(uid, name);
}

2. chatMessageList이라는 List를 운영하여 채팅 내역을 하나의 리스트로 저장해준다.

if(actionType.contains("Enter")){
    chatMessageList.add(uid+"님이 들어왔습니다.");
}else if(actionType.contains("Leave")){
    chatMessageList.add(uid+"님이 나갔습니다.");
}

3. "님" 앞의 모든 UID를 가져와서 name으로 변경해주는 작업을 진행해준다.

for(int i=0; i<chatMessageList.size(); i++){
    // "님" 앞에 uid를 가져와서 name으로 변경해주는 작업을 진행
    String message = chatMessageList.get(i);
    int uidEndIndex = message.indexOf("님");
    String getUid = message.substring(0, uidEndIndex);
    String getName = uidToNameMap.get(getUid);

    message = message.replace(getUid, getName);
    answer[i] = message;
}

헷갈렸던 점

1. 계속 2가지 케이스는 틀리다고 나오고, 또 어떤 케이스는 런타임 에러가 뜨면서 100점이 안되고 62.5점에서 머물렀었다.

이유는 if(actionType.contains("Change")에서 uidToNameMap.get(uid)를 했을 때에 저장된 UID가 없으면 null이 저장될 수 있으므로, 방어 차원에서 앞단에서 if(uidToNameMap.get(name) == null){ uidToNameMap.put(uid, name); } 코드를 짯었는데 잘못된 생각이었다. 

애초에 uidToNameMap.get(name)이 아니라 uidToNameMap.get(uid)이었어야 하고, 

그 전에 if문을 없애고 uidToNameMap.put(uid, name);을 해주면 Change에 대해서 자동으로 커버가 되는 부분이었다. 

그래서 두 가지 코드를 모두 없애주었다.

<제거 전>

// Hashmap에 uid와 name을 저장하는 부분
if(st.hasMoreElements()) {
    name = st.nextToken();    
    if(uidToNameMap.get(name) == null){
    	uidToNameMap.put(uid, name);
    }
}

// 채팅 내역을 저장하는 부분
if(actionType.contains("Enter")){
    chatMessageList.add(uid+"님이 들어왔습니다.");
}else if(actionType.contains("Leave")){
    chatMessageList.add(uid+"님이 나갔습니다.");
}else if(actionType.contains("Change"){ 
	uidToNameMap.put(uidToNameMap.get(uid), name);
}

<제거 후>

// Hashmap에 uid와 name을 저장하는 부분
if(st.hasMoreElements()) {
    name = st.nextToken();        
    uidToNameMap.put(uid, name);    
}

// 채팅 내역을 저장하는 부분
if(actionType.contains("Enter")){
    chatMessageList.add(uid+"님이 들어왔습니다.");
}else if(actionType.contains("Leave")){
    chatMessageList.add(uid+"님이 나갔습니다.");
}

<반례>

if(uidToNameMap.get(name) == null) 이 false여서 uidToNameMap.put(uid, name);을 진행하지 않아

Leave하려고 하면 없기 때문에 런타임에러가 발생한다.

String[] str = {"Enter uid1234 uidbbbb",
        "Enter uidbbbb uid1234",
        "Leave uid1234"

 

전체 코드

package Programmers;

import java.util.*;

public class PGM_42888 {
    public static void main(String[] args) {
        String[] str = {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
        solution(str);
    }
    public static String[] solution(String[] record) {
        String[] answer = {};
        HashMap<String, String> uidToNameMap = new HashMap<>();
        List<String> chatMessageList = new ArrayList<>();
        for(int i=0; i<record.length; i++){
            StringTokenizer st = new StringTokenizer(record[i]);

            String actionType = st.nextToken();
            String uid = st.nextToken();
            String name = null;
            if(st.hasMoreElements()) {
                name = st.nextToken();
                uidToNameMap.put(uid, name);
            }

            if(actionType.contains("Enter")){
                chatMessageList.add(uid+"님이 들어왔습니다.");
            }else if(actionType.contains("Leave")){
                chatMessageList.add(uid+"님이 나갔습니다.");
            }
        }
        answer = new String[chatMessageList.size()];
        for(int i=0; i<chatMessageList.size(); i++){
            String message = chatMessageList.get(i);
            int uidEndIndex = message.indexOf("님");
            String getUid = message.substring(0, uidEndIndex);
            String getName = uidToNameMap.get(getUid);

            message = message.replace(getUid, getName);
            answer[i] = message;
        }
        return answer;
    }
}

'알고리즘' 카테고리의 다른 글

백준 1967 트리의 지름(DFS)  (0) 2022.09.06
성격 유형 검사하기 java  (0) 2022.09.04
백준 2573 빙산(DFS+BFS)  (0) 2022.08.31
백준 1520 내리막길(DFS + DP)  (0) 2022.08.30
백준 2583 영역 구하기  (0) 2022.08.28
Comments