[Level2] 오픈채팅방, 가장 큰 정사각형 찾기
오픈채팅방
처음 접근 방식 > 오답 (시간 초과)
function addPerson(person, id, nickName) {
person[id] = nickName;
return person;
}
function changePerson(person, id, nickName) {
person[id] = nickName;
return person;
}
function solution(record) {
let arr = record.map((value) => value.split(" "));
let person = {};
let result = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i][0] === "Enter") {
person = addPerson(person, arr[i][1], arr[i][2]);
result.push(`${arr[i][1]}님이 들어왔습니다.`);
} else if (arr[i][0] === "Leave") {
result.push(`${arr[i][1]}님이 나갔습니다.`);
} else {
person = changePerson(person, arr[i][1], arr[i][2]);
}
}
let uid = Object.keys(person);
for (let i = 0; i < result.length; i++) {
for (let j = 0; j < uid.length; j++) {
result[i] = result[i].replace(new RegExp(uid[j], "g"), person[uid[j]]);
}
}
return result;
}
처음에는 nickName이 아닌 uid로 구성된 result 를 만든 후,
마지막에 정규식을 통해 person 객체의 키를 값으로 바꾸려고 했다.
N ** 2 + N 의 시간복잡도를 가져서 실패
하지만 정규식에 변수를 할당하는 방법을 알게 되었다!
정답
function solution(record) {
let arr = record.map(value => value.split(' '));
let person = {};
let result = [];
arr.forEach(v => {
if (v[0] === 'Enter') {
person[v[1]] = v[2];
} else if (v[0] === 'Change') {
person[v[1]] = v[2];
}
});
arr.forEach(v => {
if (v[0] === 'Enter') {
result.push(`${person[v[1]]}님이 들어왔습니다.`);
} else if (v[0] === 'Leave') {
result.push(`${person[v[1]]}님이 나갔습니다.`);
}
});
return result;
}
위에서 런타임이 났었기 때문에 최대한 동작을 줄였다.
person 메소드도 따로 만들지 않고 바로 값을 바꾸게끔 하였고,
입장과 변경만 먼저 처리하여 person 객체를 완성시킨후,
다시 입장과 퇴장에 대한 처리를 했다.
best 풀이
unction solution(record) {
const userInfo = {};
const action = [];
const stateMapping = {
'Enter': '님이 들어왔습니다.',
'Leave': '님이 나갔습니다.'
}
record.forEach((v) => {
const [state, id, nick] = v.split(' ');
if(state !== "Change") {
action.push([state, id]);
}
if(nick) {
userInfo[id] = nick;
}
})
return action.map(([state, uid]) => {
return `${userInfo[uid]}${stateMapping[state]}`;
})
}
가장 큰 정사각형 찾기
function solution(board) {
let max = 0;
if (board.length === 1 && board[0].some((elem) => elem === 1)) {
return 1;
}
for (let i = 1; i < board.length; i++) {
for (let j = 1; j < board[0].length; j++) {
if (board[i][j] !== 0) {
board[i][j] =
Math.min(board[i - 1][j], board[i][j - 1], board[i - 1][j - 1]) + 1;
max = board[i][j] > max ? board[i][j] : max;
}
}
}
return max ** 2;
}
이상한 점을 찾았다.
console.log([0, 1, 1, 1].some((elem) => elem === 1)); //true
console.log([0, 1, 1, 1].some((elem) => {elem === 1})); //false
Array.prototype.some 함수의 콜백 함수에 중괄호가 들어가면 내가 원하는대로 동작을 하지 않는다.
어째서지..?
또 이 문제는 자기를 기준으로 (위, 왼, 왼쪽대각선)의 최소값 + 1로 값을 갱신해나가는건데,
이런 풀이를 도대체 어떻게 찾느냔말이다…ㅠㅠ
모든 경우를 내가 외워놔야할까?
어렵다 어려워ㅠㅠ