코딩테스트 연습
leetcode 코딩테스트 연습 - 2722. Join Two Arrays by ID (JavaScript)
citron031
2023. 8. 20. 10:08
이번 문제는 객체를 값으로 가지는 두 배열을 합치는 문제였다.
객체의 id값은 유일해야 하고 양 배열에 id가 같으면, 이 객체를 합해야 하는 문제였다.
문제 접근 자체는 어렵지 않았지만, Time Limit Exceeded을 맞이해버렸다.
/**
* @param {Array} arr1
* @param {Array} arr2
* @return {Array}
*/
var join = function(arr1, arr2) {
const answer = [...arr1];
const memo = {}
for(let el of arr2) {
if(el.id >= 0) {
let pointer = null;
if(memo[el.id] >= 0) {
pointer = memo[el.id];
} else {
for(let j = 0; j < answer.length; j++){
if(answer[j].id === el.id) {
pointer = j;
memo[el.id] = j;
}
}
}
if(pointer === null) {
answer.push(el);
} else {
// override
answer[pointer] = {...answer[pointer], ...el};
}
} else {
answer.push(el);
}
}
return answer.sort((a, b) => a.id - b.id);
};
위의 코드가 처음 작성한 코드였는데, 나름 memo 객체를 사용하여 최적화를 하려고 했지만, 역부족이었다.
다시 생각해보면, 초기 arr1을 answer에 넣을 때 함께 memo를 설정하면, 더 빠르지 않을까 싶었다.
🧨 특히 양 배열에 이미 겹치게 id값이 존재 했을 때, 위의 코드는 딱히 memo의 역할이 없었다...
/**
* @param {Array} arr1
* @param {Array} arr2
* @return {Array}
*/
var join = function(arr1, arr2) {
const answer = [];
const memo = {};
for (let i = 0; i < arr1.length; i++) {
const el = arr1[i];
answer.push(el);
memo[el.id] = i;
}
for (let el of arr2) {
if (el.id >= 0) {
if (memo[el.id] !== undefined) {
answer[memo[el.id]] = { ...answer[memo[el.id]], ...el };
} else {
answer.push(el);
memo[el.id] = answer.length - 1;
}
} else {
answer.push(el);
}
}
return answer.sort((a, b) => a.id - b.id);
};
그렇게 memo를 다시 최적화하여 코드를 수정하였고, 이번에는 문제를 해결할 수 있었다.
🧶 memo를 최적화하는 과정에서 ChatGPT의 도움을 조금 받기도 했는데, 생각보다 더 코드를 잘 분석해주어서 놀랐다. 알고리즘에 있어서는 ChatGPT의 성능이 아주 뛰어난 것 같다.
처음에 if문 조건에 숫자가 들어간 변수를 생각없이 계속 넣었었는데, id가 0일때 false로 판별하여 문제가 되었었다.
늘 생각하지만, 조심해야하는 부분이다.