알고리즘
배열 검사
Jaeilit
2022. 8. 23. 00:05
728x90
배열 2개를 비교해서 중복을 검사하는 알고리즘
1. 함수로 배열 2개를 받아서 두번째 배열이 첫번째 배열의 제곱이 되는 수로 이루어져있는지 체크하는 알고리즘
[1, 2, 3, 2], [9, 1, 4, 4]
function same(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
for (let i = 0; i < arr1.length; i++) {
let correctIndex = arr2.indexOf(arr1[i] ** 2);
console.log(correctIndex);
if (correctIndex === -1) {
return false;
}
console.log(arr2);
arr2.splice(correctIndex, 1);
}
return true;
}
same([1, 2, 3, 2], [9, 1, 4, 4]);
// (1)[(9, 1, 4, 4)];
// (1)[(9, 4, 4)];
// (0)[(9, 4)];
// (0)[4];
// true
배열의 indexOf 메서드로 첫번째 배열에서 제곱인 값을 찾아서 두번째 배열에 splice 해줌으로써 빈 배열로 만듬
최종적으로 빈 배열이 됬다는 것은 모두 일치하는 것이라 true 그리고 for 문 도중에 index를 찾지못하면 false를 반환한다.
문자열과 배열의 두가지 연습을 해볼 수 있다. index 라는 요소는 배열에서 중요하다.
인덱스가 중요한 이유는 여러있지만 시간복잡도 개념에서 보면 push 와 pop 과 같이 배열의 끝에서 Index 를 추가하고 제거 하는건 비교적 빠르지만 shift unshift 처럼 배열의 맨 앞에서 하는 작업은 상대적으로 느릴 수 있다. 이유는 index를 0부터 다시 할당해줘야하기 때문 에 이다. 하지만 그렇게 크게 신경 쓰면서까지 shift 와 unsfhit를 피할 정도는 아니다..
2. 아나그램
아나그램이 뭔가해서 찾아봤는데, 거꾸로해도 똑바로해도 우영우입니다와 비슷하게 말장난인데
같은 글자로 다른 의미의 단어를 만드는 것을 의미한다고 한다.
기러기 토마토 .. 역삼역?
function validAnagram(str1, str2) {
if (str1.length !== str2.length) {
return false;
}
let ary = [];
for (let key of str1) {
ary.push(key);
}
for (let key of str2) {
let index = ary.indexOf(key);
if (index !== -1) {
ary.splice(index, 1);
}
console.log(ary);
}
return !ary.length;
}
// console.log(validAnagram("", ""), "trim");
// console.log(validAnagram("aazbz", "zzabz")); // false
console.log(performance.now());
console.log(validAnagram("anagram", "nagaram")); // true
console.log(performance.now());
// 33.454707980155945
// [ 'a', 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'r', 'a', 'm' ]
// [ 'r', 'a', 'm' ]
// [ 'a', 'm' ]
// [ 'm' ]
// []
// true
// 38.32233300805092
첫번째 문제와 풀이가 비슷하다고 느낄 수도 있다.
음 비슷하다 함수의 파라미터가 배열에서 문자열로 바꼇다지만
문자는 유사배열이기때문에 str.length 등 배열 메서드를 사용 할 수 있다 map 같은 건 못쓴다.
function validAnagram(str1, str2) {
if (str1.length !== str2.length) {
return false;
}
const ary = Array.from({ length: str1.length }, (v, i) => str1[i]);
for (let key of str2) {
let index = ary.indexOf(key);
if (index !== -1) {
ary.splice(index, 1);
}
console.log(ary);
}
return !ary.length;
}
// console.log(validAnagram("", ""), "trim");
// console.log(validAnagram("aazbz", "zzabz")); // false
console.log(performance.now());
console.log(validAnagram("anagram", "nagaram")); // true
console.log(performance.now());
// 34.627416998147964
// [ 'a', 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'r', 'a', 'm' ]
// [ 'r', 'a', 'm' ]
// [ 'a', 'm' ]
// [ 'm' ]
// []
// true
// 39.582416981458664
조금 다른 풀이 방법인데 배열을 for 문과 push 로 채우지않고 array.from() 메서드로도 만들 수 있는데 첫번째보다 조금 느린 모습이다.
728x90