링크 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;
}