본문 바로가기
알고리즘/알고리즘 문제풀이

[프로그래머스] 오픈 채팅방(Java)

by E145 2022. 2. 2.
반응형

백준 번호 제목

 

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

문제 설명

 

 - 카카오톡 오픈 채팅방에 들어오거나, 나가거나, 닉네임을 변경한 기록이 담긴 문자열이 주어진다.

 

 - 해당 문자열을 바탕으로 최종적으로 방을 개설한 사람이 보게 되는 문자열을 배열 형태로 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;
        }
    }
}

 

 

반응형

댓글