카테고리 없음
[자바스크립트 빈도수 세기패턴]
홍순2
2023. 12. 13. 01:01
유데미 자바스크립트알고리즘& 자료구조 마스터 클래스 Colt Steele강의를 듣고 공부한 내용을 정리한 것입니다.
선형시간 n^2
주석을 보면 설명이 있습니다.
function same(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
// 선형시간 n제곱
// 하나의 for루프밖에 없어서 전체배열을 반복함
for (let i = 0; i < arr1.length; i++) {
let correctIndex = arr2.indexOf(arr1[i] ** 2);
// 제곱 해서 해당 값이 없으면 false
if (correctIndex === -1) {
return false;
}
console.log(arr2);
// 배열의 인덱스 첫번째 값을 삭제
// ex) [9,1,4,4] -> 1의제곱삭제 [9,4,4] -> 2의제곱삭제 [9,4] -> 3의제곱삭제 [4]
// 마지막배열인 2의제곱삭제 []
arr2.splice(correctIndex, 1);
}
return true;
}
same([1, 2, 3, 2], [9, 1, 4, 4]);
결과
[9,1,4,4]
[9,4,4]
[9,4]
[4]
true
선형시간 2n
차이점은 for루프가 분기되 있는것을 볼 수 있습니다. n^2은 점점 숫자가 불어서 선형시간이 최악입니다.
결론은 n^2 < 2n이 낫습니다.
// 선형시간 2n
function same(arr1, arr2) {
// 배열 길이 확인
if (arr1.length !== arr2.length) {
return false;
}
let frequencyCounter1 = {};
let frequencyCounter2 = {};
for (let val of arr1) {
// var에 1을 더하거나 이미포함되어 있다면 1로 초기화
// 암묵적 숫자 타입 변환 {[] || 0} + 1 = 1
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
}
// var에 1을 더하거나 이미포함되어 있다면 1로 초기화
// 암묵적 숫자 타입 변환 {[] || 0} + 1 = 1
for (let val of arr2) {
frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
}
// 카운터1의객체값 제곱한 것이 카운터2에 없으면 false
// ex) 2의 제곱은 4가 있으니 True
for (let key in frequencyCounter1) {
if (!(key ** 2 in frequencyCounter2)) {
return false;
}
// ex) 카운터1,2 키의 개수가 같아야함
if (frequencyCounter2[key ** 2] !== frequencyCounter1[key]) {
return false;
}
}
console.log(frequencyCounter1);
console.log(frequencyCounter2);
return true;
}
same([1, 2, 3, 2], [9, 1, 4, 4]);
결과
{ '1': 1, '2': 2, '3': 1 }
{ '1': 1, '4': 2, '9': 1 }