본문 바로가기
문제 풀이/Programmers

[프로그래머스] 42888번: 오픈 채팅방 (JavaScript)

by Electrohyun 2025. 7. 8.

 


 

생각 과정

 

그냥 단순히 로그를 남기는 건 줄 알고 정말 쉽다고 생각했었는데... 닉네임 바꾸거나 하면 전부 다 변경해야 하는 상황이 생겨서 많이 고생한 문제이다. 누가 시스템을 이렇게 만들어

 

1. 유저의 이름과 uid를 저장하는 객체를 만들자.

 

2. 접속 / 나감 메세지를 기록할 배열도 만들자.

 

3. 객체와 배열을 call-by-reference와 비슷한 방식으로 사용하자.

(JS는 모든 값을 call-by-value 방식으로 처리하지만, 객체와 배열 같은 참조형 데이터는 참조값(reference)를 값으로 전달하기 때문에 가능하다)

 

function changeLog(userData, userLog) {
  for (let i = 0; i < userLog.length; i++) {
    const parts = userLog[i].split(" "); 
    const uid = parts[0];
    const action = parts[1];

    if (action === "IN") {
      userLog[i] = userData[uid] + "님이 들어왔습니다.";
    } else if (action === "OUT") {
      userLog[i] = userData[uid] + "님이 나갔습니다.";
    }
  }
}

function enterChat(userCommand, userData, userLog) {
  const userID = userCommand[1];
  const userName = userCommand[2];

  userData[userID] = userName;
  userLog.push(userID + " IN");
}

function changeChat(userCommand, userData) {
  const userID = userCommand[1];
  const userName = userCommand[2];

  userData[userID] = userName;
}

function leaveChat(userCommand, userLog) {
  const userID = userCommand[1];

  userLog.push(userID + " OUT");
}

function solution(record) {
  const database = {};
  const log = [];

  for (let i = 0; i < record.length; i++) {
    let newRecord = record[i].split(" ");

    if (newRecord[0] === "Enter") enterChat(newRecord, database, log);
    if (newRecord[0] === "Change") changeChat(newRecord, database);
    if (newRecord[0] === "Leave") leaveChat(newRecord, log);
  }

  changeLog(database, log);
  
  return log;
}