Algorithm/Programmers

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

ikjo 2022. 5. 6. 13:46

문제 설명

 

 

 

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

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

programmers.co.kr

 

접근 방법

입력받은 사용자별 기록들(String[] record)에 대해 순서대로 split를 통해 상태(Enter, Leave, Change), 아이디, 닉네임을 분리하고 별도의 UserState 구조체를 선언하여 사용자의 상태와 아이디를 저장하여 List 자료구조에 add 합니다. 다만 Change의 경우 기존 사용자의 닉네임을 바꾸는 작업이므로 UserState에 포함시키지 않습니다. UserState의 구조체는 다음과 같이 선언해주었습니다.

 

    static class UserStatue {

        String userId;
        String statue;

        UserStatue(String userId, String statue) {
            this.userId = userId;
            this.statue = statue;
        }

        boolean isEnter() {
            return statue.equals("Enter");
        }

        boolean isLeave() {
            return statue.equals("Leave");
        }
    }

 

아울러 별도의 HashMap을 선언하여 사용자의 아이디별로 닉네임을 저장하도록 했는데, 이는 추후 Enter와 Change 작업으로 인해 사용자 아이디별로 닉네임이 바뀔 수 있기 때문입니다.

 

Map<String, String> nickNamesById = new HashMap<>();

 

최종적으로 도출된 List<UserState> 자료구조를 순회하여 Enter 상태일 경우 `{nickName}님이 들어왔습니다.` 형식으로, Leave 상태일 경우 `{nickName}님이 나갔습니다.` 형식으로 String 배열에 담아 반환합니다.

 

    private String[] getResult(List<UserStatue> userStatues) {
        String[] result = new String[userStatues.size()];

        int i = 0;
        for (UserStatue userStatue : userStatues) {
            if (userStatue.isEnter()) {
                result[i++] = nickNamesById.get(userStatue.userId) + "님이 들어왔습니다.";
            }
            else if (userStatue.isLeave()) {
                result[i++] = nickNamesById.get(userStatue.userId) + "님이 나갔습니다.";
            }
        }

        return result;
    }

 

전체 소스 코드

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

class Solution {

    Map<String, String> nickNamesById = new HashMap<>();

    static class UserStatue {

        String userId;
        String statue;

        UserStatue(String userId, String statue) {
            this.userId = userId;
            this.statue = statue;
        }

        boolean isEnter() {
            return statue.equals("Enter");
        }

        boolean isLeave() {
            return statue.equals("Leave");
        }
    }

    public String[] solution(String[] record) {

        List<UserStatue> userStatues = new ArrayList<>();

        for (String logsOfUser : record) {
            String[] data = logsOfUser.split(" ");
            String statue = data[0];
            String userId = data[1];

            UserStatue userStatue;

            switch (statue) {
                case "Enter" -> {
                    String nickName = data[2];
                    nickNamesById.put(userId, nickName);
                    userStatue = new UserStatue(userId, statue);
                    userStatues.add(userStatue);
                }
                case "Change" -> {
                    String nickName = data[2];
                    nickNamesById.put(userId, nickName);
                }
                case "Leave" -> {
                    userStatue = new UserStatue(userId, statue);
                    userStatues.add(userStatue);
                }
            }
        }

        return getResult(userStatues);
    }

    private String[] getResult(List<UserStatue> userStatues) {
        String[] result = new String[userStatues.size()];

        int i = 0;
        for (UserStatue userStatue : userStatues) {
            if (userStatue.isEnter()) {
                result[i++] = nickNamesById.get(userStatue.userId) + "님이 들어왔습니다.";
            }
            else if (userStatue.isLeave()) {
                result[i++] = nickNamesById.get(userStatue.userId) + "님이 나갔습니다.";
            }
        }

        return result;
    }
}

 

 

참고자료