[알고리즘] 오픈채팅방 - 프로그래머스

Subin·2021년 10월 13일
0

알고리즘

목록 보기
2/4

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

dictionary를 활용하는 게 주요 했다.

중간 과정

function changeTarget(newRecord, target) {
  let result = newRecord.slice();
  for (let i = 0; i < target.length; i++) {
    for (let j = 0; j < newRecord.length; j++) {
      if (newRecord[j][1] == target[i][1]) {
        result[j] = [newRecord[j][0], newRecord[j][1], target[i][2]];
      }
    }
  }
  return result;
}

changeTarget(newRecord, target);

function solution(record) {
  const { newRecord, target } = firstTrim(record);
  const result = changeTarget(newRecord, target).map(
    (el) => `${el[2]}님이 ${el[0]}`,
  );
  return result;
}

function firstTrim(record) {
  let target = [];
  const newRecord = record
    .map((info) => {
      const newInfo = info.split(' ');
      const isIncludes = target.some((el) => el.includes(newInfo[1]));
      const handleExsitUser = () => {
        target = target.map((el) => {
          if (el[1] === newInfo[1]) {
            return newInfo;
          } else {
            return el;
          }
        });
      };
      if (newInfo[0] == 'Enter') {
        if (!isIncludes) {
          target.push(newInfo);
        }
        if (isIncludes) {
          handleExsitUser();
        }
        newInfo[0] = '들어왔습니다.';
      } else if (newInfo[0] == 'Leave') {
        newInfo[0] = '나갔습니다.';
      } else if (newInfo[0] == 'Change') {
        if (!isIncludes) {
          target.push(newInfo);
        }
        if (isIncludes) {
          handleExsitUser();
        }
      }
      return newInfo;
    })
    .filter((el) => {
      return el[0] !== 'Change';
    }); // 'Change 제거'
  return { newRecord, target };
}

changeNickname(중간단계 changeTarget) 에서 for문을 두 번 쓰지 않기 위해 dictionary 를 활용할 수 있다. (아니면 시간초과 됨)

function createNewRecordAndDict(record) {
  const target = [];
  const newRecord = [];
  for (let i = 0; i < record.length; i++) {
    const newInfo = record[i].split(' ');
    if (newInfo[0] == 'Enter') {
      newInfo[0] = '들어왔습니다.';
      target.push({ value: newInfo, userId: newInfo[1] });
      newRecord.push(newInfo);
    } else if (newInfo[0] == 'Leave') {
      newInfo[0] = '나갔습니다.';
      newRecord.push(newInfo);
    } else {
      target.push({ value: newInfo, userId: newInfo[1] });
    }
  }
  const dict = Object.assign(
    target.reduce((acc, obj) => ((acc[obj.userId] = obj.value), acc), {}),
  );
  return { newRecord, dict };
}

function changeNickname(newRecord, dict) {
  let result = newRecord.slice();
  for (let i = 0; i < result.length; i++) {
    if (dict[result[i][1]]) {
      result[i] = `${dict[result[i][1]][2]}님이 ${result[i][0]}`;
    }
  }

  return result;
}

function solution(record) {
  const { newRecord, dict } = createNewRecordAndDict(record);
  const answer = changeNickname(newRecord, dict);
  return answer;
}
profile
정확하게 알고, 제대로 사용하자

0개의 댓글