[JAVA] Lv2. 오픈채팅방

김상윤·2022년 11월 21일
0
post-thumbnail
post-custom-banner

오픈채팅방


[문제설명]

문제가 너무 길어서 생략하겠습니다..😇

[제한 조건]

마찬가지로 너무 길어서 생략..😇

위에 제시된 링크를 참조해주세요!


[나의 풀이]

// HashMap, ArrayList, Switch문 적극 이용
// user라는 맵에 uid를 key로 nickname을 value로 저장
// action이라는 ArrayList에 {log, uid}라는 String[]을 시간 순서대로 저장
// 정답결과는 action의 원소를 하나씩 빼와서 log를 기준으로 어떤 행동인지 파악하고,
// uid를 이용하여 user맵에서 최신으로 업데이트된 nickname을 가져와서 정답배열의 원소를 조합

import java.util.*;

public class 오픈채팅방 {
    static Map<String, String> user = new HashMap<>();
    static List<String[]> action = new ArrayList<>();

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

        for (String e : record) {
            String[] s = e.split(" ");

            switch(s[0]) {
                case "Enter" :
                    Enter(s);
                    break;
                case "Leave" :
                    Leave(s);
                    break;
                case "Change" :
                    Change(s);
                    break;
            }
        }

        String[] answer = new String[action.size()];

        for (String[] e : action) {
            int idx = action.indexOf(e);
            String log = e[0];
            String nickname = user.get(e[1]);

            StringBuffer sb = new StringBuffer();
            switch(log) {
                case "0" :
                    sb.append(nickname);
                    sb.append("님이 들어왔습니다.");
                    answer[idx] = sb.toString();
                    break;
                case "1" :
                    sb.append(nickname);
                    sb.append("님이 나갔습니다.");
                    answer[idx] = sb.toString();
                    break;
            }
        }

        return answer;
    }

    public static void Enter(String[] s) { // enter의 log는 0
        // 만약 들어왔는데 기존에 들어왔던 기록이 있는 사람이라면,
        // change함수 실행
        String uid = s[1];
        String nickname = s[2];

        user.put(uid, nickname);
        action.add(new String[] {"0", uid}); // log uid

    }
    public static void Leave(String[] s) { // leave의 action은 1
        String uid = s[1];
        String nickname = user.get(s[1]);
        action.add(new String[] {"1", uid}); // log uid
    }
    public static void Change(String[] s) { // change의 action은 기록하지 않는다.
        String uid = s[1];
        String nickname = s[2];

        user.put(uid, nickname);
    }

    public static void main(String[] args) {
        오픈채팅방 answer = new 오픈채팅방();
//        System.out.println("answer.solution() = " + answer.solution());
    }
}

위 코드와 같이 작성해보았다.
HashMap, ArrayList를 이용하여 풀이해보았고, 이번에는 "Enter", "Leave", "Change"와 같은 여러 Command가 있어, Switch문을 이용해보았다.

주어진 record배열의 원소를 split하여, 각 command에 어울리는 함수를 switch문을 이용하여 호출하도록 하였다...

user라는 맵에 uid를 key로 nickname을 value로 저장하도록 하였고, action이라는 ArrayList에 {log, uid}라는 String[]을 시간 순서대로 저장시켜주었다.
정답결과는 action의 원소를 하나씩 빼와서 log를 기준으로 어떤 행동인지 파악하고, uid를 이용하여 user맵에서 최신으로 업데이트된 nickname을 가져와서 정답배열의 원소를 조합하고 리턴시키도록 하였다.

(작성할때는 간결해보였으나, 완성하고 보니 좀 많이 긴 느낌..☹️)

LV2와 카카오 문제치고는 문제에서 요구하는대로 구현하면 무난히 맞출 수 있는 문제였던 것 같다. 다만, 주의할 점은 최대한 불필요한 연산, 반복을 줄여서 시간초과를 피하자.

아래는 채점결과이다.

profile
알고리즘을 아직도 모르겠다
post-custom-banner

0개의 댓글