ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - Lv2. 오픈채팅방
    PS 2022. 3. 10. 21:38

    문제 : [2019 KAKAO BLIND RECRUITMENT] 오픈채팅방

    • 문제 내용은 여기.
    • 쉽게 말해, 모든 출입 내역을 반환하면 된다. 최초에 방을 개설한 사람이 보게되는 출입내역이 아니라, 처음부터 끝까지의 모든 출입내역을 반환하면 된다.

    풀이

    import java.util.HashMap;
    import java.util.ArrayList;
    
    public class OpenChattingRoom {
    
        class Message {
    
            final String uid;
            final String message;
    
            public Message(String uid, String message) {
                this.uid = uid;
                this.message = message;
            }
            public String getUid() {
                return this.uid;
            }
            public String getMessage() {
                return this.message;
            }
        }
    
        private final String ENTER_STR = "님이 들어왔습니다.";
        private final String LEAVE_STR = "님이 나갔습니다.";
    
        public String[] solution(String[] record) {
            HashMap<String, String> user = new HashMap<String, String>();
            ArrayList<Message> msgs = new ArrayList<Message>();
    
            // 출입 이력 기록, 입장 시에는 유저 정보도 기록
            for (String rec : record) {
                String[] r = rec.split(" "); // r[] - 0:status, 1:uid, 2(optional): nickname
    
                if ("Enter".equals(r[0])) { 
                    if (!r[2].equals(user.get(r[1]))) {
                        user.put(r[1], r[2]);
                    }
                    msgs.add(new Message(r[1], ENTER_STR));
                }
                else if ("Leave".equals(r[0])) {
                    msgs.add(new Message(r[1], LEAVE_STR));
                }
                else { // "Change".equals(r[0])
                    user.put(r[1], r[2]);
                }
            }
    
            // 출입 이력 출력 
            String[] entry = new String[msgs.size()];
            for (int i = 0; i < msgs.size(); i += 1) {
                entry[i] = new StringBuilder()
                        .append(user.get(msgs.get(i).getUid()))
                        .append(msgs.get(i).getMessage())
                        .toString();
            }
    
            return entry;
        }
    
    }

    후기

    1 ) 출입 메시지(유저id, 닉네임 & 출입내용)를 차곡차곡 쌓고싶다. -> 메시지 객체를 리스트로 쌓으면 되겠다(리스트<메시지>). -> 메시지 내용에서 가져온 key값(uid)로 회원정보의 닉네임도 가져오면 되겠다. (유저.get(메시지.getUid()) or 유저.findByUid(메시지.getUid()).닉네임)
    2 ) list 형식으로 편하게 담기 위해 메시지는 별도의 class로 빼준다. 유저정보는 uid와 nickname만 key-value 페어로 기억하고 있으면 되니까, class로 빼줄 필요 없고 Map에 담자.
    3 ) 문제를 읽고 나서 당일에 풀지 않고 며칠 뒤에 풀었더니 스무스하게 스윽 풀렸다. 아마도 혼자 쉬는 시간마다 어떻게 구현할지 생각했던 것 같다. 학습시간을 소모하지 않으면서도 유익을 챙길 수 있는 방법이었다.
    4 ) 문제를 꼬아내거나 설명을 일부러 장황하게 하는 건 좋은데, 제한 사항은 명확하게 선을 그어주면 좋을 것 같다. 최초에 방을 개설한 사람에게 보여지는 메시지라고 하는데, 중도에 방장이 나가는 경우를 생각하면 어떻게 보여야 하는가? 자신이 나간 메시지도 보이게 해야한다는 것은 사실 말이 안되지 않나. 결국 요구사항은 처음부터 마지막까지의 모든 출입사항을 보이면 되는 것이었다.

    댓글

Designed by Tistory.