알고리즘 문제를 풀며 많이 사용했던 JS 기술들을 정리해보았다.
코테에서 파이썬만큼 강력하진 않지만, JS도 익숙해지면 충분히 좋은 언어다.
Array
const vs let
ES6에 변수 선언 방식이 다음과 같이 추가되었다.
const = 재할당 불가능
let = 재할당 가능
배열도 마찬가지이다.
단 헷갈릴 수 있는 부분이 있어 따로 정리해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const constArr = [1, 1, 1]; let letArr = [2, 2, 2];
constArr[1] = ["new"]; letArr[1] = ["new"];
constArr.push("new"); letArr.push("new");
constArr = ["new", "arr"]; letArr = ["new", "arr"];
constArr = constArr.reduce(); letArr = constArr.reduce();
constArr = constArr.map(); letArr = constArr.map();
|
초기화
1 2 3 4
| const input = [1, 2, 3, 4, 5]; const allTrue = new Array(input.length).fill(true);
console.log(allTrue);
|
객체, 배열 값 추출
객체, 배열에서 값을 추출할 때
위치와 매칭하여 값을 변수에 바로 저장할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12
| const [a, b, c] = [1, 2, 3];
const [d, e] = [4, 5, "add"];
const { f, g, h } = { f: 6, g: 7, h: 8 }; const { i, j } = { i: 9, j: 10, k: 11 };
console.log(a, b, c, d, e, f, g, h, i, j);
|
큐와 스택처럼 사용하기
큐와 스택처럼 쓸 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13
| const myArr = [1, 2, 3, 4, 5];
const firstItem = array.shift(); console.log(myArr);
array.unshift(firstItem); console.log(myArr);
const lastItem = array.pop(); console.log(myArr);
array.push(lastItem); console.log(myArr);
|
중간에 위치한 요소 제거, splice
- 원본을 수정시킨다
- splice(index, index로부터 추출할 길이)
1 2 3 4 5 6 7 8 9 10
| const myArr = [1, 2, 3, 4, 5];
const part = myArr.splice(1, 2); console.log(part); console.log(myArr);
const findIdx = myArr.indexOf(1); myArr.splice(findIdx, 1); console.log(myArr);
|
전체 복사, 특정 부위 추출 slice
- 원본을 그대로 놔둔다
- shallow copy
- slice(추출시작 index, 추출하려는 마지막 index + 1)
1 2 3 4 5 6 7 8 9 10
| const myArr = [1, 2, 3, 4, 5];
const copy = myArr.splice(1, 2); console.log(copy); console.log(myArr);
const findIdx = myArr.indexOf(1); myArr.slice(findIdx, 1); console.log(myArr);
|
reduce()
정말 많이 쓰인다.
알고리즘의 거의 모든 문제에서
배열 전체를 돌면서 검증하고, 어떤 아웃풋을 만드는 일이 생기기 때문이다.
array.reduce(콜백함수, 초깃값)
콜백함수
- 매개변수는 (누적값, 현재값, 현재index, 원본배열)
- return 값은 마지막 턴에서 return하는 누적값이다.
- 매개변수는 앞에서부터 최소 2개, 쓰고 싶은 곳까지만 쓰면 된다.
루프
- 매 턴, 전 턴에서 누적된 값을 “누적값”으로 받아온다.
- 누적값이 없는 첫 턴은 누적값 = 초깃값이다
- 원본 배열은 건드리지 않는다. 따라서 array는 항상 원본 배열 그대로이다.
1 2 3 4 5 6 7 8 9 10 11
| const fiveNums = [11, 22, 33, 44, 55]; const ten = 10;
let namuzi = 0;
let sum = fiveNums.reduce((acc, curr, currIdx, array) => { acc += curr; namuzi += curr % ten; return acc; }, 0);
|
forEach()
for문으로 배열 전체를 훑는 것과 같은 기능이다.
가독성이 조금 더 좋다는 장점이 있고,
중간에 break를 할 수 없다는 단점이 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const fiveNums = [11, 22, 33, 44, 55];
for (let i = 0; i < fiveNums.length; i++) { console.log(i); console.log(fiveNums[i]); console.log(fiveNums); }
fiveNums((item, index, array) => { console.log(index); console.log(item); console.log(array); });
|
every, some
Object
set
set 선언
set 선언시 배열이 input으로 필요하다.
1 2 3 4 5 6 7 8 9
| const mySet = new Set([1, 2, 2, 3, 3, 4, 4]); console.log(mySet);
console.log(mySet.size); console.log(mySet.has(1)); mySet.add(5); console.log(mySet); mySet.delete(5); console.log(mySet);
|
set <=> array
보통 set에는 forEach를 제외하면 array에서 유용하게 쓰는 메서드를 지원하지 않는다.
“…”를 활용하여 array로 임시로 형 변환을 하고 array 메서드를 빌릴 수 있다.
set 표준 문법
array 표준 문법
1 2 3 4 5 6 7
| const mySet = new Set([1, 2, 2, 3, 3, 4, 4]);
const tmp = [...mySet]; console.log(tmp);
const newSet = new Set([...mySet].sort((a, b) => a - b).slice(0, 2));
|
Math
min, max
Math.min(1,2,3) => 1
Math.max(1,2,3) => 3
1 2 3 4 5 6 7 8 9 10 11 12
| const arr = [1, 2, 3];
let num = Math.min(...arr);
const zero = 0; if (zero < num) zero = num;
num = Math.min(zero, num);
|