record
배열을 순회하면서 uid
, nickname
을 따로 저장해두고, answer
배열에는 uid
와 나갔습니다.
or 들어왔습니다.
를 저장해둔다. 마지막으로 answer
을 순회하면서 uid
를 nickname
으로 바꾼다.
테스트케이스 2개만 통과하고 나머지는 런타임 에러와 시간초과가 떴다.
uid와 nickname 객체를 dic
배열에 저장한다. 배열 안에 객체를 만들어서 이를 탐색?하는데 시간이 많이 소요되는 것 같은 느낌..?
uid와 nickname 따로 저장할 때
dic
배열에 uid가 존재하지 않으면 값을 push한다.dic
배열에서 해당 uid를 제거해준다. (틀림: 나갔다가 다시 들어온 경우는 nickname 존재하지만 다시 들어오지 않았다면 nickname 없음,,)dic
배열에서 해당 uid의 nickname 변경해준다.function solution(record) {
let answer = [];
let dic = [];
for (let i in record) {
let temp = record[i].split(' ');
if (temp[0] === 'Enter') {
answer.push(temp[1] + ' 들어왔습니다.');
let filtered = dic.filter(e => e.uid === temp[1]);
if (filtered.length === 0) {
dic.push({
uid: temp[1],
nickname: temp[2],
});
}
} else if (temp[0] === 'Leave') {
answer.push(temp[1] + ' 나갔습니다.');
dic = dic.filter(e => e.uid !== temp[1]);
} else {
dic.map(e => {
if (e.uid === temp[1]) {
return e.nickname = temp[2];
}
});
}
}
for (let i in answer) {
let tmp = answer[i].split(' ');
let filtered = dic.filter(e => e.uid === tmp[0]);
answer[i] = filtered[0].nickname + '님이 ' + tmp[1];
}
return answer;
}
나머지는 시간초과
uid
와 nickname
을 따로 저장할 때
dic
배열에 uid가 존재하지 않으면 값을 push한다. 이미 존재한다면 바꾼다.dic
배열에서 해당 uid
의 nickname
을 변경해준다.function solution(record) {
let answer = [];
let dic = [];
for (let i in record) {
let temp = record[i].split(' ');
if (temp[0] === 'Enter') {
answer.push(temp[1] + ' 들어왔습니다.');
let filtered = dic.filter(e => e.uid === temp[1]);
if (filtered.length === 0) {
dic.push({
uid: temp[1],
nickname: temp[2],
});
}
else {
for (let i in dic) {
if (dic[i].uid === temp[1]) {
dic[i].nickname = temp[2];
}
}
}
} else if (temp[0] === 'Leave') {
answer.push(temp[1] + ' 나갔습니다.');
} else {
dic.map(e => {
if (e.uid === temp[1]) {
return e.nickname = temp[2];
}
});
}
}
for (let i in answer) {
let tmp = answer[i].split(' ');
let filtered = dic.filter(e => e.uid === tmp[0]);
answer[i] = filtered[0].nickname + '님이 ' + tmp[1];
}
return answer;
}
function solution(record) {
let answer = [];
let dic = [];
let flag = 0;
for (let i in record) {
let temp = record[i].split(' ');
if (temp[0][0] === 'E') {
answer.push(temp[1] + ' 들어왔습니다.');
let filtered = dic.filter(e => e.uid === temp[1]);
if (filtered.length === 0) {
dic.push({
uid: temp[1],
nickname: temp[2],
});
}
else {
for (let i in dic) {
if (dic[i].uid === temp[1]) {
dic[i].nickname = temp[2];
}
}
}
} else if (temp[0][0] === 'L') {
answer.push(temp[1] + ' 나갔습니다.');
} else {
for (let i in dic) {
if (dic[i].uid === temp[1]) {
dic[i].nickname = temp[2];
break;
}
}
}
}
for (let i in answer) {
let tmp = answer[i].split(' ');
for (let j in dic) {
if (dic[j].uid === tmp[0]) {
answer[i] = dic[j].nickname + '님이 ' + tmp[1];
break;
}
}
}
return answer;
}
찾아보니 25~30번에서 시간초과가 나는 이유는 nickname
을 변경할 때(나갔다가 다시 들어올 때, change할 때) 모든 record를 순회하면서 해당 uid
의 nickname
을 바꿔서 시간 복잡도 O(n)이 추가로 들게 되어서이다. 총 O(n^2)이 되어서 시간 초과가 난다. 이를 해결하기 위해서 자바스크립트의 Map 자료구조를 이용했다.
맵(Map): 키가 있는 데이터를 저장한다는 점에서 객체와 유사하다. Map
은 키에 다양한 자료형을 허용한다. (객체를 키로 사용할 수 있다.)
map[key]
는 Map을 쓰는 올바른 방법이 아니다. 이렇게 사용할 수 있긴 하지만 이 방법은map
을 일반 객체처럼 취급하게 되고, 여러 제약이 생기게 된다. map을 사용할 땐 map 전용 메서드set
,get
등을 사용하자.
맵의 요소에 반복 작업할 때 사용할 수 있는 메서드
function solution(record) {
let answer = [];
let dic = [];
let map = new Map();
for (let i in record) {
let temp = record[i].split(' ');
if (temp[0][0] === 'E') {
answer.push(temp[1] + ' 들어왔습니다.');
map.set(temp[1], temp[2]);
} else if (temp[0][0] === 'L') {
answer.push(temp[1] + ' 나갔습니다.');
} else {
map.set(temp[1], temp[2]);
}
}
for (let i in answer) {
let tmp = answer[i].split(' ');
answer[i] = map.get(tmp[0]) + '님이 ' + tmp[1];
}
return answer;
}
function solution(record) {
let answer = [];
let people = {};
record.map((item, i) => {
let tmp = item.split(' ');
if (tmp[0] === 'Enter') {
answer.push(tmp[1] + ' 님이 들어왔습니다.');
people[tmp[1]] = tmp[2];
} else if (tmp[0] === 'Leave') {
answer.push(tmp[1] + ' 님이 나갔습니다.');
} else {
people[tmp[1]] = tmp[2];
}
});
let result = [];
answer.map(item => {
let tmp = item.split(' ');
result.push(people[tmp[0]] + tmp[1]);
});
return result;
}
function solution(record) {
let nicknames = new Map();
let result = [];
record.map(rec => {
const [command, uid, nickname] = rec.split(' ');
if (command !== 'Leave') nicknames.set(uid, nickname);
if (command === 'Enter') {
result.push(`${uid} 님이 들어왔습니다.`);
} else if (command === 'Leave') result.push(`${uid} 님이 나갔습니다.`);
});
return result.map(res => {
const uid = res.split(' ')[0];
const nickname = nicknames.get(uid);
return res.replace(`${uid} `, nickname);
});
}