TEAM 알고싶다/성공 문제

[프로그래머스] JavaScript - 오픈채팅방

서크호 2022. 6. 9. 00:30

📄 문제

- 간단 설명

  • 채팅방에 들어오고 나가거나, 
  • 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때,
  • 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를
  • 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

 

- 형식 

  • 모든 유저는 [유저 아이디]로 구분한다.
  • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
  • [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
  • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")

- 주의점 

  • 닉네임 변경이 있어서 조금 복잡한 것 같다. 최종 변경 사항으로 모두 적용해서 출력해야 한다!
  • 닉네임 변경 방법 두가지
    • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
    • 채팅방에서 닉네임을 변경한다.
     

입출력 예시


📝 나의 통과 풀이

function solution(record) {
  let answer = [];
  let state = new Map();
  record.forEach((user) => {
    let [type, userId, name] = user.split(" ");
    if (type == "Enter" || type == "Change") {
      state.set(userId, name);
    }
  });

  record.forEach((user) => {
    let [type, userId, name] = user.split(" ");
    if (type == "Enter") {
      let userIn = state.get(userId) + "님이 들어왔습니다.";
      answer.push(userIn);
    }
    if (type == "Leave") {
      let userOut = state.get(userId) + "님이 나갔습니다.";
      answer.push(userOut);
    }
  });

  return answer;
}

⌨ 접근법

1. new Map을 사용해서 id와 name 저장하기 위해 state 변수 선언

2. 반복문을 돌려서 record 의 각 요소마다 state 만들기

2-1. 공백을 기준으로 ( user.split(" ") ) 각 요소의 type, userId, name 변수로 나눠서 저장

2-2. 만약의 들어오는 type 이 "Enter" 이거나 "Change" 이면 state에 userid : name 으로 저장한다.

2-3. 그러면 userId 에 따라 name을 계속 업데이트 시켜서 최종 변경 이름까지 잘 들어간다!

3. 또 반복문을 돌려서 record의 요소 수 만큼 문자열을 만들어 answer에 넣어주기 (그냥 for 문법을 쓸 걸 그랬다.)

3-1. 2-1 처럼 공백을 기준으로 ( user.split(" ") ) 각 요소의 type, userId, name 변수로 나눠서 저장

3-2. 들어오는 type이 "Enter" 채팅방에 들어온 유저면 state 에서 userId 로 조회해 문자열 붙여서 answer에 push

3-3. 들어오는 type이 "Leave" 채팅방에서 나간 유저면 state 에서 userId 로 조회해 문자열 붙여서 answer에 push

3-4. 반복문이 모두 끝나면 문자열이 다 들어간 answer return


📖 배운 점 

1. Map

  • Map 사용이 서툴렀는데 이 문제로 계속 수정 반복 하다 보니 제법 익숙해진 것 같다!

2. 구조 분해 할당

  • 이 문제는 우리 팀의 레오의 코드를 참조해서 풀었다. 
  • 레오의 코드( const [type, uid, name] = item.split(' '); ) 를 나도 적용해보니 코드가 너무 깔끔해져서 놀랐다.
  • 앞으로도 자주 사용할 것 같다!

📚 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr