250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 렌더링 최적화
- jwt
- 항해99 사전스터디
- 항해99 미니프로젝트
- 리액트 메모이제이션
- 웹 크롤링
- 리액트 메모
- toggle-btn
- 리액트
- 알고리즘
- 함수형 프로그래밍 특징
- js배열 알고리즘
- 자바스크립트 엔진 v8
- 코어자바스크립트
- 테스트 코드 툴 비교
- 리액트 렌더링 최적화
- 실행컨텍스트
- this
- chromatic error
- 항해99 부트캠프
- v8 원리
- JS module system
- 타입스크립트
- FP 특징
- gql restapi 차이
- next js
- 리덕스
- 웹팩 기본개념
- Js module
- 항해99
Archives
- Today
- Total
Jaeilit
배열 검사 본문
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