프로그래머스 lv2 오픈채팅방

namkun·2022년 7월 6일
0

코딩테스트

목록 보기
13/79
post-custom-banner

문제링크

오픈 채팅방

풀이

import java.util.ArrayList;
import java.util.HashMap;

class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> nickNameMap = new HashMap<>();
        ArrayList<String> commandList = new ArrayList<>();
        for (String data : record) {
            String[] splitData = data.split(" ");
            if (splitData[0].equals("Enter") || splitData[0].equals("Change")) {
                nickNameMap.put(splitData[1], splitData[2]);
            }

            if (splitData[0].equals("Enter") || splitData[0].equals("Leave")) {
                commandList.add(data);
            }
        }

        String[] answer = new String[commandList.size()];
        for (int i = 0; i < commandList.size(); i++) {
            String[] splitData = commandList.get(i).split(" ");
            answer[i] = nickNameMap.get(splitData[1]) + getMsg(splitData[0]);
        }

        return answer;
    }

    public String getMsg(String data) {
        if (data.equals("Enter")) {
            return "님이 들어왔습니다.";
        } else if (data.equals("Leave")) {
            return "님이 나갔습니다.";
        }
        return null;
    }
}

소감

  • 닉네임 체크용 맵과, 명령어들을 순서대로 넣어두는 commandList 만들었다.
  • 이를 통해서 마지막으로 변경되는 닉네임 정보를 수집하고, 명령어들과 uid를 따로 수집하도록 하였다.
  • 객체로 풀어볼까 했지만 하나하나 구현하는게 귀찮아서 일단 이렇게 풀었으나...객체로 구현하는게 확장성 면에서는 굉장히 좋아보였다. 귀찮아 하지 말자.. for 문 하나가 사라진다..
  • 객체로 푸신 분의 코드를 첨부해두도록 하겠다.
import java.util.ArrayList;
import java.util.HashMap;

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

    private HashMap<String, UserInfo> userMap = new HashMap<>();

    private class UserInfo {
        public String userId;
        public String nickName;

        public UserInfo(String userId, String nickName) {
            this.userId = userId;
            this.nickName = nickName;
        }

    }

    private class Command {
        public char command;
        public String userId;

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


    public String[] solution(String[] records) {
        ArrayList<Command> commandList = new ArrayList<>();

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

            switch(command.charAt(0)) {
                case 'E': // Enter
                    nickName = split[2];
                    if(userMap.containsKey(userId) == false) {
                        userMap.put(userId, new UserInfo(userId, nickName));
                    } else {
                        userMap.get(userId).nickName = nickName;
                    }

                    commandList.add(new Command(command.charAt(0), userId));
                    break;
                case 'L': // Leave
                    commandList.add(new Command(command.charAt(0), userId));
                    break;
                case 'C': // Change
                    nickName = split[2];
                    userMap.get(userId).nickName = nickName;
                    break;
            }
        }

        return commandList.stream()
                .map(cmd -> String.format( cmd.command == 'E' ? ENTER_FORMAT : LEAVE_FORMAT , userMap.get(cmd.userId).nickName))
                .toArray(ary -> new String[commandList.size()]);
    }
}
profile
개발하는 중국학과 사람
post-custom-banner

0개의 댓글