본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 오픈채팅방(lv.2)

- 내 방법 풀이

  • 문제를 읽고, Id값과 닉네임을 보고, HashMap을 사용하면 되겠다는 생각이 들었다. 먼저 record를 읽으면서 유저 아디와 닉네임을 (key,value) 값으로 저장하되 맨 앞 단어가 Enter와 Change일 경우에 add하는 조건을 걸었다. 왜나하면 Leave는 아이디 값만 가지고 있어 닉네임 값이 없기 때문이었다. 
  • 위의 과정을 통해 최종 변경된 값만 가지고 있는 고유ID와 닉네임 Map을 얻게 되었고, 다시 한 번 record를 조회하면서 첫 단어를 switch문으로 가져와서 각 경우에 맞는 메시지를 저장하도록 코드를 구성했다.
  • 최종변경된 메시지만 출력하면 되므로 복잡한 과정없이 2번의 record 조회로 문제를 풀 수 있었다.
  • 효율성 측면에서도 record의 최대 길이 * 2 = 200,000번이라서 충분히 시간을 통과할 수 있을 거 같았고, 통과했다.
  • 오랜만에 한번에 푼 문제여서 기분이 좋다.
import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        // HashMap 1 : record를 읽으면서 유저 아디를 key, 닉네임을 value로 저장.
        HashMap<String, String> idToNickname = new HashMap<>();
        for (String S : record) {
            String[] arr = S.split(" ");
            if (arr[0].equals("Enter") || arr[0].equals("Change")) idToNickname.put(arr[1],arr[2]);
        }
        
        // record를 읽으며, 기록에 따른 메시지 출력.
        ArrayList<String> messages = new ArrayList<>();
        for (String S : record) {
            String[] arr = S.split(" ");
            switch (arr[0]) {
                case "Enter": messages.add(idToNickname.get(arr[1]) + "님이 들어왔습니다.");
                    break;
                case "Leave": messages.add(idToNickname.get(arr[1]) + "님이 나갔습니다.");
                    break;
                case "Change": break;
            }
        }
        
        return messages.toArray(answer);
    }
}

- 다른 사람 방법 풀이

  • 자바스럽다라는 말은 코테 문제를 준비하면서 처음 듣게된 말이었다.
  • 밑의 코드는 자바스러운 코드가 아닐까 싶다. 실제 웹 서비스를 구현하기 위해서는 아래와 같은 방법이 쓰여야 하는데, 과연 나는 실제로 아래와 같이 쓸 수 있을까..
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()]);
    }
}