알고리즘/프로그래머스

[프로그래머스] 오픈채팅방(LEVEL 2)

컴뀨 2022. 1. 10. 19:41

문제링크

문제접근 ❓

  • HashMap<Key, Value>

오답노트 ❓

  • 오답 코드

      import java.util.*;
    
      class Solution {
    
          List<String> answers; // 채팅방 입/퇴장 기록 리스트
          Map<String, String> idMap; // 채팅방에 접속한 이력이 있는 아이디 map
          final String COME_IN = "님이 들어왔습니다.";
          final String GO_OUT = "님이 나갔습니다.";
    
          public String[] solution(String[] record) {
              String[] answer = {};
              answers = new ArrayList<>();
              idMap = new HashMap<>();
    
              for (String s : record) {
                  String[] arr = s.split(" "); // arr[0] : 명령어, arr[1] : id, arr[2] : 닉네임
    
                  if ("Leave".equals(arr[0])) { // Leave 명령어일 경우 arr[1] : id
                      answers.add(idMap.get(arr[1]) + GO_OUT);
                  } else {
                      if (idMap.containsKey(arr[1])) { // 채팅방에 접속한 이력이 남아있는 아이디라면
                          updateRecord(arr[0], arr[1], arr[2]); // 업데이트를 하자!
                      } else {
                          // 새로운 유저가 Enter 로 입장한 경우
                          answers.add(arr[2] + COME_IN);
                          idMap.put(arr[1], arr[2]);
                      }
                  }
              }
    
              answer = new String[answers.size()];
              answers.toArray(answer);
    
              return answer;
          }
    
          public void updateRecord(String cmd, String id, String newName) {
              if ("Enter".equals(cmd)) { // 기존의 유저가 닉네임을 변경하고 들어온 경우
                  answers.add(newName + COME_IN);
              }
    
              String originName = idMap.get(id); // 해당 id의 기존 닉네임
              idMap.put(id, newName); // 바꾸고자 하는 닉네임은 newName
    
              for (int i = 0; i < answers.size(); i++) {
                  String a = answers.get(i);
                  String s = a.substring(0, a.indexOf("님"));
                  if (s.equals(originName)) {
                      answers.add(i, a.replace(originName, newName));
                  }
              }
          }
      }
  • 틀린 이유

    실행결과


Solution

import java.util.*;

class Solution {

    Map<String, String> idMap; // 채팅방에 접속한 이력이 있는 아이디 map
    final String COME_IN = "님이 들어왔습니다.";
    final String GO_OUT = "님이 나갔습니다.";

    public String[] solution(String[] record) {
        String[] answer = {};
        idMap = new HashMap<>();
        int cnt = 0;

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

            if ("Leave".equals(arr[0])) { // 채팅방에서 나가는건 닉네임 변화가 없다.
                continue;
            } else if ("Change".equals(arr[0])) {
                cnt++;
            }
            idMap.put(arr[1], arr[2]); // Map 에다가 id 에 해당하는 nickname을 계속해서 update
        }

        answer = new String[record.length - cnt];
        int idx = 0;

        // 채팅방 입/퇴장에 대해서만 현재 map에 기록된 nickname을 바탕으로 문구를 기록하면 끝!
        for (String s : record) {
            String[] arr = s.split(" ");
            if ("Enter".equals(arr[0]))
                answer[idx++] = idMap.get(arr[1]) + COME_IN;
            else if ("Leave".equals(arr[0]))
                answer[idx++] = idMap.get(arr[1]) + GO_OUT;
        }


        return answer;
    }

}