[알고리즘/PS] Snippets Dictionary - 배열

Donghun Seol·2022년 11월 28일
0

알고리즘

목록 보기
1/1

코딩테스트 대비 몸만들기. 뇌지컬이 딸리면 피지컬이라도 좋아야...

배열

배열의 초기화와 생성

N길이의 배열을 0으로 초기화

Array(N).fill(0) // [0,0,0,0,...]

N길이의 배열을 초기화하고, 순서대로 채우기

둘째줄 처럼 작성하면 더욱 간결하다. Array.from에서 콜백을 바로 받아 mapping한 결과를 만들 수 있다.

Array(N).fill(null).map((_, idx) => idx + 1); // [1,2,3,4,...]
Array.from(new Array(5), (_, idx) => idx + 1); // [1,2,3,4,5]

Array.from('myStr', (elem, idx) => idx + ' ' + elem)

유사배열객체를 배열로 Array.prototype.from()

Array.from이 콜백을 받는점을 활용하면 이렇게도 출력가능하다.

Array.from('myStr', (elem, idx) => idx + ': ' + elem);
// ['0: m', '1: y', '2: S', '3: t', '4: r']

문자열을 배열로

문자열을 배열로 변경하려면 Array.from, ..., split 세 가지 방법 활용 가능하다.

Array.from('myStr') // ['m', 'y', 'S', 't', 'r']
Array.of('myStr', 'myStr2') // ['myStr', 'myStr2']

'myString'.split(''); // ['m', 'y', 'S', 't', 'r', 'i', 'n', 'g']
'myString'.split(' '); // ['myString']

배열을 문자열로 바꾸려면 toString(), join()을 사용한다. join()이 좀 더 유연하다.

const arr = ['Apple', 'Banana', 'Orange'];
arr.toString() // Apple,Banana,Orange
arr.join('-') // Apple-Banana-Orange

객체를 배열로, 배열을 객체로

spread operator

가장 간단하다. 생성된 객체의 키는 배열의 인덱스가 된다.

arr = ['가','나','다']
newObj = {...arr} // {'0':'가', '1':'나', '2':'다'}

Object.fromEntries()

key value pair 배열을 객체로 변환한다. Map을 Object로도 변환 가능하다.

let arr = [['first', 'A'], ['second', 'B'], ['third', 'C']];

let obj = Object.fromEntries(arr);
console.log(obj); // { first: 'A', second: 'B', third: 'C' }

const map = new Map([ ['foo', 'bar'], ['baz', 42] ]);
const mapToObj = Object.fromEntries(map);
console.log(mapToObj); // { foo: "bar", baz: 42 }

반대로는 이렇게 할 수 있다. Object.keys()와 map을 활용한다.

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0}
var result = Object.keys(obj).map((key) => [Number(key), obj[key]]);
// [[1,5],[2,7],[3,0],[4,0],[5,0]]

배열의 변환, 정렬

slice()와 splice()

slice

slice(start [, end])

slice는 원본불변, slicing이 적용된 새로운 배열을 반환한다.
만약 start에 -2를 넣으면 배열의 끝에서 2개 원소가 담긴 배열을 반환한다.
음수와 양수값을 start, end에 모두 삽입가능하다. 음수값에 arr.length를 더하면 해당 양수값 인덱스를 구할 수 있다.

arr = Array.from(Array(10), (elem, idx) => idx + 1);
arr.slice(-2) // [-9, -10]
arr.slice(-2, -5) // [];

splice

splice(start[, deleteCount[, item1[, item2[, ...]]]])
splice는 인자들의 조합을 통해 다양한 방식으로 활용 가능하다. splice를 통해 요소의 삭제, 변경, 추가 모두 가능하다. splice는 원본을 바꾼다.

  1. 요소의 삭제
arr.splice(2); // 2번 인덱스부터 이후의 모든 요소 제거, 반환값은 제거된 배열.
arr.splice(2, 1); // 2번 인덱스로부터 1개의 원소 제거, 반환값은 제거된 배열.
  1. 요소의 추가
arr.splice(2, 0, ...[7,8,9]); // 2번 인덱스에 0개 제거하고 7,8,9를 삽입
arr.splice(3, 1, 'i got in'); // 3번 인덱스에 1개 제거하고 'i got in'을 삽입 반환값은 삭제된 배열
  1. 요소의 변경
    삭제 후 삽입하면 변경이 된다.

pop(), push(), shift(), unshift();

원본을 변경
shift()와 unshift()가 헷갈린다. 이렇게 정리한다.

  1. 두 메서드 모두 배열의 가장 앞 인덱스를 대상으로 수행.
  2. shift()는 정방향이므로 배열을 오른손으로 밀어서 마지막 요소를 떨어트리는 것. 원소 반환
  3. 역방향 unshift()는 왼손으로 밀고 빈공간에 추가하는 것을 상상하자. 길이 반환

참고로 배열 중간에 값을 삽입하거나 제거할때는 splice()를 활용한다.

배열 내 중복된 요소를 제거

Set, filter, forEach 등 여러 방법이 있지만 Set을 활용하는 것이 가장 직관적이라 생각한다.

const arr = [1,2,3,1,2,4,5];
const set = new Set(arr);
const uniqArr = [...set];

flat()

중첩 배열 구조를 평탄화한다. 인자로 depth를 지정할 수 있다.
depth를 Infinity로 지정하면 끝까지 평탄화한다.

const newArr = arr.flat([depth])

sort()

원본을 변경한다. 원본을 유지하고싶으면 slice나 ...연산자를 활용해야 한다.

arr.sort((a,b) => a - b); // 원본 변경
arr.slice().sort((a, b) => a - b); // 원본 불변

arr.slice().sort((a, b) => a[0].charCodeAt() - b[0].charCodeAt()); // 첫번째 문자 기준으로 문자열 정렬
arr.slice().sort((a, b) => a.localeCompare(b)); // 모든 문자를 기준으로 문자열 정렬

// 한글도 가능함
arr2 = ['다','카','라','나','파','가']
arr2.slice().sort((a, b) => a.localeCompare(b)); // 한글 가나다순 정렬

reverse();

원본을 변경
배열을 뒤집는다.

indexOf(), includes()

indexOf(), lastIndexOf(),

해당 배열에서 인자로 전달된 값과 일치하는 맨 처음 인덱스를 반환한다.
배열이 해당 인자를 요소로 가지고 있는지를 반환한다.

문자열

객체

수학

이진탐색

DFS

BFS

profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글