본문 바로가기
알고리즘

[프로그래머스/JAVA] 오픈채팅방

by 상후 2022. 6. 3.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42888

 

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

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

programmers.co.kr

 

풀이 방법

 

닉네임을 가지고 있는 User 클래스와 Map의 key 값을 userId로 활용하여 풀이하였습니다.

 

내 코드(JAVA)

 

class User {
    private String nickName;

    public User(String nickName) {
        this.nickName = nickName;
    }

    public void changeNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getNickName() {
        return nickName;
    }
}

 class Solution {
    public  String[] solution(String[] record) {
        String[] answer = {};
        Map<String, User> commands = new LinkedHashMap<>();

        for (String command : record) {
            String[] arr = command.split(" ");
            if(arr.length == 2) {
                continue;
            }

            String initCommand = arr[0];
            String userId = arr[1];
            String nickName = arr[2];

            if("Enter".equals(initCommand)) {
                commands.put(userId, new User(nickName));
            } else if ("Change".equals(initCommand)) {
                commands.get(userId).changeNickName(nickName);
            }
        }

        List<String> answerList = new ArrayList<>();
        for (String command : record) {
            String[] arr = command.split(" ");
            String initCommand = arr[0];
            String userId = arr[1];
            String nickName = commands.get(userId).getNickName();

            if("Enter".equals(initCommand)) {
                answerList.add(nickName + "님이 들어왔습니다.");
            } else if ("Leave".equals(initCommand)) {
                answerList.add(nickName + "님이 나갔습니다.");
            }
        }

        answer = answerList.toArray(new String[0]);
        return answer;
    }

}

 

 

리팩토링 코드

다른 분들의 답을 참고하여 작성해본 코드입니다.

 

class User {
    private String nickName;

    public User(String nickName) {
        this.nickName = nickName;
    }

    public void changeNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getNickName() {
        return nickName;
    }
}

class Command {
    private String command;
    private String userId;

    public Command(String command, String userId) {
        this.command = command;
        this.userId = userId;
    }

    public String getCommand() {
        return command;
    }

    public String getUserId() {
        return userId;
    }
}

class Solution {

    public String[] solution(String[] records) {
        String[] answer = {};
        Map<String, User> userMap = new LinkedHashMap<>();
        List<Command> commandList = new ArrayList<>();

        final String ENTER_FORMAT = "%s님이 들어왔습니다.";
        final String LEAVE_FORMAT = "%s님이 나갔습니다.";

        for (String record : records) {
            String[] arr = record.split(" ");
            String command = arr[0];
            String userId = arr[1];
            String nickName = "";

            if("Enter".equals(command)) {
                nickName = arr[2];
                userMap.put(userId, new User(nickName));
                commandList.add(new Command(command, userId));
            } else if ("Leave".equals(command)) {
                commandList.add(new Command(command, userId));
            } else if ("Change".equals(command)) {
                nickName = arr[2];
                userMap.get(userId).changeNickName(nickName);
            }
        }

        answer = new String[commandList.size()];
        for (int i = 0; i < commandList.size(); i++) {
            String userId = commandList.get(i).getUserId();
            String command = commandList.get(i).getCommand();

            answer[i] = String.format("Enter".equals(command) ? ENTER_FORMAT : LEAVE_FORMAT, userMap.get(userId).getNickName());
        }

        return answer;
    }

}

 

 

 

 

 

728x90
반응형

댓글