본문 바로가기
코테연습

71. 오픈채팅방 Javascript

by hxunz 2022. 6. 28.

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

 

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

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 채팅방을 들어오거나 나가거나 닉네임을 변경하는 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return
  • 주어진 자료는 무엇인가?
     - 채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어진다.
  • 조건은 무엇인가?
     - 중복 닉네임 허용
     -
    record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
     - 첫 단어는 Enter, Leave, Change 중 하나이다.
     - 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
     - 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
     - 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
     - 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.

2. 계획

  1. 주어진 배열을 쪼개서 2차원 배열로 만든다. 
  2. 비어있는 맵 객체를 만든다.
  3. 1번 배열을 순회하면서 현재 요소의 0번째 인덱스가 Enter 혹은 Change 인 경우 위 맵 객체에 아이디랑 이름을 넣는다.
  4. 1번 배열을 순회하면서 현재 요소의 0번째 인덱스가
    4-1 Enter인 경우 2번 맵에서 이름을 가져온다.
    4-2 Leave인 경우 2번 맵에서 이름을 가져온다. 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (record) => {
  const recordArr = record.map((it) => it.split(' '));
  let userIds = new Map();
  let result = [];

  recordArr.map(it => {
    if (it[0] === "Enter" || it[0] === "Change") {
      userIds.set(it[1], it[2]);
    }
  })

  recordArr.map(it => {
    if (it[0] === 'Enter') {
      result.push(`${userIds.get(it[1])}님이 들어왔습니다.`);
    } else if (it[0] === 'Leave') {
      result.push(`${userIds.get(it[1])}님이 나갔습니다.`);
    }
  })

  return result;
};

test('chat', () => {
  expect(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"])).toEqual(["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]);
});

'코테연습' 카테고리의 다른 글

73. 프린터 Javascript  (0) 2022.07.01
72. 가운데 글자 가져오기 Javascript  (0) 2022.06.30
70. 카펫 Javascript  (0) 2022.06.27
69. 가장 큰 수 Javascript  (0) 2022.06.24
68. 같은 숫자는 싫어 Javascript  (0) 2022.06.23

댓글