티스토리 뷰

프로그래머스 42888번 - 오픈채팅방

프로그래머스 42888번 - https://programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스 42888번 - https://programmers.co.kr/learn/courses/30/lessons/42888

 

요구사항

1. 문제가 길기 때문에 본문의 사진을 참고하길 바랍니다.

 

요구사항 분석 및  풀이과정

1. 가장 까다로운 점은 기존의 유저가 닉네임을 바꿀 경우는 이미 출력된 기록의 닉네임을 바꿔줘야 한다는 점이다.

2. 하지만 이 문제에서는 약간의 특이점이 있는데, 실시간 처리가 아니라는 점이다. 닉네임 변경 사항을 모두 반영하고 출력할 기록들을 만들어내면 된다는 것이다.

 

예를 들어 유저 아이디가 "uid1234"라는 유저가 "Muzi"라는 닉네임으로 접속하고, 퇴장하고, 닉네임을 "Ryan"라고 바꾼다고 할 때 실시간으로 처리한다면 다음과 같을 것이다.

 

하지만 우리는 시간의 흐름대로 실시간으로 들어오는 요청(Enter, Leave, Change)을 처리하는 것이 아니라 이미 처리된 요청들을 결과로 바꾸는 것이기 때문에 복잡하게 생각하지 않고 최종적인 결과만 바라보면 된다. 

 

그 말은 기존의 출력된 것을 바꾼다고 생각하는 것이 아니라, 유저의 닉네임이 변경된 것을 선반영하여 출력을 하는 것이다.

 

작업 흐름을 요약하면 다음과 같습니다.

 

1. 주어진 요청을 바탕으로 변화(Change)가 모두 반영된 각 유저의 아이디와, 닉네임을 수집합니다. 

2. 위에서 획득한 유저의 정보로 주어진 요청들 중 입장(Enter)과 퇴장(Leave)에 대해서 출력을 만듭니다.

 

 

소스코드 작성

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

class Solution {

    private final static String ENTER_MSG = "%s님이 들어왔습니다.";
    private final static String LEAVE_MSG = "%s님이 나갔습니다.";
    
    private Map<String, String> fetchInfos(String[] records) {
        Map<String, String> result = new HashMap<>();
        
        for(String record : records) {
            String[] tokens = record.split(" ");
            String command = tokens[0];
            String userId = tokens[1];
            
            if ("Enter".equals(command) || "Change".equals(command)) {
                String nickname = tokens[2];
                result.put(userId, nickname);
            }
        }
        
        return result;
    }
    
    private String enterMessage(String nickname) {
        return String.format(ENTER_MSG, nickname);
    }
    
    private String leaveMessage(String nickname) {
        return String.format(LEAVE_MSG, nickname);
    }
    
    public String[] solution(String[] records) {
        Map<String, String> infos = fetchInfos(records);
        
        List<String> result = new ArrayList<>();
        for(String record : records) {
            String[] tokens = record.split(" ");
            String command = tokens[0];
            String userId = tokens[1];
            String nickname = infos.get(userId);
            
            if ("Enter".equals(command)) {
                result.add(enterMessage(nickname));
            } else if ("Leave".equals(command)) {
                result.add(leaveMessage(nickname));
            }      
        }
        
        return result.toArray(new String[0]);
    }
}

 

결과

 

소스코드 깃허브 주소

링크

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함