본문 바로가기

Algorithm

[프로그래머스(LV2), JAVA]오픈채팅방

문제를 보자

문제가 너무 길다....

근데 단순한 문제라 생각이 들었는데, 약간에 트릭이 있어보였다.

닉네임을 바로 출력해 주는 것이 아닌, uid에 따라 이름을 설정해 주면 되지 않을까 했다.

 

한번 내가 생각한 알고리즘을 보자.

 

채팅을 넣을 List와 uid를 키값으로, name을 value값으로 하는 Map을 만든다.

 

for문을 사용해 입력값(record)을 하나씩 받아 StringTokenizer를 사용하여 entrance, uid, name으로 나누었다.

  → 여기서 record는 "entrance uid name" 으로 이루어진 값들을 얘기한다.

 

여기서 주의할 점은 Leave가 나온다면 어차피 등록된 uid이기 때문에 따로 name을 지정해 주지 않아도 된다.

(Change는 name을 등록하는 이유는 단지 uid에 변경된 name을 가져오기 위해서이다.)

 

이제 chat_log를 저장해보자.

if문을 사용해 Enter, Leave, Change가 각각 들어올 경우로 나눈다.

Enter가 들어올 경우 usr_map에 uid를 key값으로 name을 value값으로 두고, chat_log를 넣는다.

Leave가 들어올 경우 chat_log만 넣어준다.

Change가 들어올 경우 uid와 name을 HashMap으로 넣어준다.

 

여기서 chat_log를 이름 대신 uid로 넣어주는데 마지막에 uid를 usr_map에 등록되어 있는 uid에 대한 name으로 변경하기 위함이다.

if문이 아닌 switch문도 사용 가능하다!

하지만, if에 "==" 연산자를 사용할 수 없는데 "=="연산자는 주소값을 비교하지만, 각각 저장되는 영역이 달라 문자열 자체를 비교할 수 있는 equals를 사용해야 한다.

 

이제 answer에 답을 넣어주자. 배열의 크기는 당연히 chat_log의 크기만큼 만들어 주어야 한다.

0번째 index부터 시작하기에 index 변수를 0으로 초기화 시켜준다.

이제 각각 chat_log에 있는 chat을 가져와 uid를 subString 해준다.

위 사진과 같이 chat에서 uid는 "님" 전까지의 index인데, subString을 위해 "님"의 index를 indexOf를 사용해 구해주어 subString(0, "님"의 index)를 사용하여 uid를 구해준다.

그리고 chat에서 구한 uid를 usr_map에 저장되어 있는 uid를 통해 매칭되는 name으로 replace 해준다.

그 값을 answer 배열에 0번째 index부터 1씩 증가하여 입력해준다.

 

그러면 정확한 값이 출력될 것이다.

 

결과는

완벽하게 작동한다!!

 

전체코드

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        List<String> chat_log = new ArrayList<>();
        Map<String, String> usr_map = new HashMap<>();

        for(int i = 0; i < record.length; i++) {
            StringTokenizer st = new StringTokenizer(record[i]);
            String entrance = st.nextToken();
            String uid = st.nextToken();
            String name = "";

            if(!entrance.equals("Leave")) {
                name = st.nextToken();
            }

            if (entrance.equals("Enter")) {
                usr_map.put(uid, name);
                chat_log.add(uid + "님이 들어왔습니다.");
            } else if (entrance.equals("Leave")) {
                chat_log.add(uid + "님이 나갔습니다.");
            } else {
                usr_map.put(uid, name);
            }
        }

        String[] answer = new String[chat_log.size()];
        int index = 0;

        for(String str : chat_log) {
            int uid_index = str.indexOf("님");
            String uid = str.substring(0, uid_index);

            String str2 = str.replace(uid, usr_map.get(uid));

            answer[index++] = str2;

        }

        return answer;
    }
}