프로그래머스-2019 KAKAO BLIND RECRUITMENT ( 오픈채팅방 by Java )

Flash·2022년 2월 3일
0

Programmers-Algorithm

목록 보기
14/52
post-thumbnail

HashMap 이용하기

프로그래머스 2019 KAKAO BLIND RECRUITMENT Level 2 문제 오픈채팅방Java를 이용해 풀어보았다.
HashMap을 이용해 간단히 풀 수 있는 문제였다. 다른 사람들의 풀이를 보니 매우 다양하던데 결국 원리는 다 같은 것 같아서 내 풀이에서 더 수정하지는 않았다.

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/42888


<ID, Nickname> HashMap 만들기

앞서 어떤 닉네임으로 들어왔든지 마지막에 어떤 닉네임을 갖고 있느냐가 중요하기 때문에 HashMap을 이용해 특정 ID에 매핑되는 닉네임 값을 가지는 데이터를 저장해주자.

즉, 들어올 때의 닉네임을 보존해줄 필요없이 마지막 순간에 어떤 닉네임인지가 중요한 것이다. 다음 그림으로 이해해보자.들어올 때는 uid1234Muzi 라는 닉네임이지만, 마지막에는 Prodo 라는 닉네임을 가진다.

이를 위해 명령어가 EnterChange 일 때 map에 put(uid, name) 을 수행해주면 된다. 세 가지 명령어 Enter, Change, Leaveaction이라는 변수로 명명해주었다.

이를 코드로 표현하면 다음과 같다.

switch(action){
      case "Enter": // action1
          uidName.put(uid, name);
          break;
      case "Change": // action3
          uidName.put(uid, name);
          break;
}

ID + Action 조합 정보 저장해주기

앞서 완성한 HashMapuid에 따른 name 정보였다.
그렇다면 이제 실제로 메시지를 생성하기 위해 들어오고 나가는 명령을 저장해주기 위한 작업이 필요하다.

이 경우에는 uid + action 정보를 저장해주면 된다. action에 저장해줄 정보는 오직 EnterLeave 두 개만 저장해주면 된다. 실제 출력될 메시지는 나가고 들어오는 것만 표시해주기 때문이다. 이때 Enter1, Leave2로 표시해준다.

그림으로 표시하면 다음과 같다.이에 따라 출력될 메시지를 추가해주면 된다.

먼저 위의 정보를 LinkedList<String[]> uidAction에 저장해주자. 이를 코드로 표현하면 다음과 같다.

switch(action){
       case "Enter": // action1
           uidAction.add(new String[]{uid, "1"});
           break;
       case "Leave": // action2
           uidAction.add(new String[]{uid, "2"});
           break;
}

위 정보를 저장해주고 메시지를 생성하는 과정은 다음과 같다.

String[] answer = new String[uidAction.size()];
int msgIdx = 0;

for(String[] msg: uidAction){
     String uid = msg[0];
     int actionNum = Integer.parseInt(msg[1]);
     switch(actionNum){
           case 1: // 입장
               answer[msgIdx] = uidName.get(uid) + "님이 들어왔습니다.";
               break;
           case 2: // 퇴장
               answer[msgIdx] = uidName.get(uid) + "님이 나갔습니다.";
               break;
      }
      msgIdx++;
}

uidAction에 몇 번 action이 저장됐는지에 따라서 switch문을 따라가면 된다.


위의 모든 코드를 합쳐 작성하면 다음과 같다. 내가 제출한 코드다.

import java.util.HashMap;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class OpenChat {
    static HashMap<String, String> uidName = new HashMap<>();
    static LinkedList<String[]> uidAction = new LinkedList<>(); // Enter:1, Leave:2, Change:3

    static String[] solution(String[] record) {
        operateOrder(record);
        String[] answer = new String[uidAction.size()];
        int msgIdx = 0;

        for(String[] msg: uidAction){
            String uid = msg[0];
            int actionNum = Integer.parseInt(msg[1]);
            switch(actionNum){
                case 1: // 입장
                    answer[msgIdx] = uidName.get(uid) + "님이 들어왔습니다.";
                    break;
                case 2: // 퇴장
                    answer[msgIdx] = uidName.get(uid) + "님이 나갔습니다.";
                    break;
            }
            msgIdx++;
        }
        return answer;
    }

    static void operateOrder(String[] record){
        for(String order: record){
            StringTokenizer stk = new StringTokenizer(order);
            String action = stk.nextToken();
            String uid = stk.nextToken();

            switch(action){
                case "Enter": // action1
                    uidName.put(uid, stk.nextToken());
                    uidAction.add(new String[]{uid, "1"});
                    break;
                case "Leave": // action2
                    uidAction.add(new String[]{uid, "2"});
                    break;
                case "Change": // action3
                    uidName.put(uid, stk.nextToken());
                    break;
            }
        }
    }

    public static void main(String args[]) {
        String[] record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
        String[] result = solution(record);
        for(String line: result) System.out.println(line);
    }
}

HashMap을 이용해 쉽게 해결이 가능한 문제였다.

profile
개발 빼고 다 하는 개발자

0개의 댓글