JavaScript를 다루다 보면 객체 배열 안에 흩어져 있는 데이터를 특정 기준으로 묶어서 집계해야 하는 경우가 자주 발생합니다. 이번 글에서는 여러 사람의 거래 내역이 담긴 배열을 사람별로 그룹화하여 금액 합계를 구하는 방법을 reduce() 메서드를 활용해 알아보겠습니다.예를 들어, 다음과 같이 여러 사람의 거래 정보가 담긴 객체 배열이 있다고 가정해 보겠습니다.const transactions = [{ name: Rakesh, amount: 1500 }, { name: Rajesh, amount:
문제 상황어떤 회사의 제품 정보가 담긴 두 개의 객체 배열이 있다고 가정해 보겠습니다.const first = [ { id: 57e7a1cd6a3f3669dc03db58, quantity:3 }, { id: 57e77b06e0566d496b51fed5, quantity:3 }, { id: 57e7a1cd6a3f3669dc03db58, quantity:3 }, { id: 57e77b06
이미지 경로와 순서 번호(order number)가 쉼표로 연결된 형태의 문자열 배열이 있다고 가정해 보겠습니다.const images = [ photo1.jpg,0, photo2.jpg,2, photo3.jpg,1 ];순서 번호를 기준으로 하면 올바른 정렬 순서는 photo1 → photo3 → photo2입니다. 따라서 우리가 해야 할 일은 각 문자열을 순서 번호에 맞게 정렬한 뒤, 경로 값만 추출하여 새로운 배열을 만드는 것입니다. 최종적으로 원하는 결과는 다음과 같습니다.const orderedImage
개요이번 글에서는 양수를 하나 입력받아 해당 숫자가 2의 거듭제곱인지 아닌지에 따라 불리언(Boolean) 값을 반환하는 함수 isPowerOfTwo()를 작성해 보겠습니다.예를 들어 다음과 같은 결과가 나와야 합니다.console.log(isPowerOfTwo(3)); // falseconsole.log(isPowerOfTwo(32)); // trueconsole.log(isPowerOfTwo(2048)); // trueconsole.log(isPowerOfTwo(256)); // trueconsole.log(isPow
JavaScript에서는 배열 리터럴을 작성할 때 쉼표를 연속으로 사용하면 희소 배열(sparse array), 즉 값이 비어 있는 인덱스(hole)가 생길 수 있습니다. 이번 글에서는 이러한 빈 인덱스를 찾아 그 자리에 값을 채워 넣고, 빈 공간이 없다면 배열 맨 뒤에 값을 추가하는 함수를 직접 구현해 보겠습니다.문제 상황예를 들어 다음과 같이 중간중간 빈 값이 포함된 배열이 있다고 가정해 보겠습니다.const arr = [43,534534,645,64,,645,64,,645,,645,,65,,645,,64];여기서 우리가 만들
문제 상황다음과 같은 불리언 배열의 배열(2차원 배열)이 있다고 가정해 보겠습니다.const arr = [[true,false,false],[false,false,false],[false,false,true]];각 하위 배열의 같은 위치에 있는 요소들을 OR(||) 연산자로 결합하여, 이 배열을 하나의 1차원 배열로 병합하는 함수를 작성해야 합니다.해결 방법: Array.prototype.reduce() 활용이 문제는 Array.prototype.reduce() 메서드를 사용하면 깔끔하게 해결할 수 있습니다. reduce()는 배열
JavaScript에서는 첫 번째 인수로 1차원 배열을, 두 번째 인수로 숫자 n을 받아 부모 배열 내부에 n개의 하위 배열을 생성하고(가능한 경우), 요소들을 적절히 분배하는 함수가 필요할 때가 있습니다.분배 조건과 제약 사항여기서 중요한 제약 조건이 있습니다. 예를 들어 배열에 9개의 요소가 있고 4개의 하위 배열을 만들어야 한다고 가정해 보겠습니다. 각 하위 배열에 2개씩 나누면 총 5개의 하위 배열이 필요하고, 3개씩 나누면 3개의 하위 배열로 충분합니다. 이런 경우에는 정확히 n개가 아니라 가장 가까운 낮은 개수(이 경우
배열에서 가장 먼저 두 번 이상 등장하는 요소의 인덱스를 반환하는 함수를 작성해야 합니다. 만약 어떤 요소도 두 번 이상 등장하지 않는다면 -1을 반환하면 됩니다.여기서 핵심 조건은 상수 공간(constant space), 즉 추가적인 메모리를 사용하지 않고 문제를 해결해야 한다는 점입니다.접근 방법이 문제는 for 루프로 배열을 순회하면서, Array.prototype.lastIndexOf() 메서드를 활용해 현재 요소가 배열 안에서 중복되어 있는지 확인하는 방식으로 해결할 수 있습니다.lastIndexOf()는 특정 값이 마지막
JavaScript 개발을 하다 보면 하나의 배열을 다른 배열에 담긴 값들을 기준으로 정렬해야 하는 경우가 종종 있습니다. 예를 들어, 특정 요소들을 배열의 맨 앞으로 끌어올리고 나머지 요소들은 기존 순서를 그대로 유지하고 싶은 상황이 그렇습니다.문제 상황다음과 같이 원본 배열과 정렬 기준이 될 배열이 있다고 가정해 보겠습니다.const originalArray = [Apple, Cat, Fan, Goat, Van, Zebra]; const sortOrder = [Zebra, Van];여기서 우리가 원하는 결과는 sortOrder
JavaScript를 사용하다 보면 배열에 담긴 특정 키만 남기고 객체의 나머지 속성을 제거해야 하는 경우가 종종 있습니다. 이번 글에서는 그 방법을 예제와 함께 살펴보겠습니다.먼저 다음과 같이 하나의 배열과 하나의 객체가 있다고 가정해 보겠습니다.const arr = [a, d, f]; const obj = { a: 5, b: 8, c: 4, d: 1, e: 9, f: 2, g: 7 };우리가 작성할 함수는 이 객체와 배열을 인자로 받아, 배열의 요소에 해당하지 않는 객체 속성을
다음과 같은 이진 배열(배열 A)이 있다고 가정해 보겠습니다.const arr = [1,0,1,1,1,1,0,1,1];이 배열을 sumRight()와 같은 함수에 전달하면 아래와 같은 출력 배열(배열 B)이 생성됩니다.const output = [1,0,4,3,2,1,0,2,1];함수의 동작 원리배열 arr의 요소는 0 또는 1만 가질 수 있습니다. 이 함수는 배열의 마지막 요소부터 거꾸로 거슬러 올라가며 연속된 1의 개수를 셉니다. 규칙은 다음과 같습니다.배열 arr에서 1이 연속해서 나타나면, 출력 배열의 해당 위치에는 첫 번째
문제 정의배열을 인수로 받아, 배열 내 어딘가에 세 개의 연속된 동일한 요소(즉, 같은 값을 가진 요소)가 존재하면 true를, 그렇지 않으면 false를 반환하는 checkThree()라는 JavaScript 함수를 작성해야 합니다.접근 방법이 문제는 배열을 단 한 번의 순회만으로 해결할 수 있습니다. 핵심 아이디어는 다음 두 가지 정보를 추적하는 것입니다.이전 요소(element): 직전에 확인한 배열 요소연속 횟수(count): 해당 요소가 지금까지 연속으로 나타난 횟수순회 도중 어떤 요소가 이미 두 번 연속 등장했는데 현재
배열(첫 번째 인수)이 오름차순 또는 내림차순으로 정렬된 상태에서, 특정 값(두 번째 인수)이 삽입되어야 할 가장 낮은 인덱스를 반환하는 함수를 작성해 보겠습니다. 반환값은 반드시 숫자여야 합니다. 문제 이해하기 예를 들어 getIndexToInsert()라는 함수가 있다고 가정해 보겠습니다. getIndexToInsert([1,2,3,4], 1.5, asc) → 1 // 1.5는 1(인덱스 0)보다 크지만 2(인덱스 1)보다 작기 때문입니다. 마찬가지로, getIndexToInsert([20,3,5], 19, asc) → 2 //
배열 arr과 숫자 n이 주어졌을 때, 모든 요소가 최대 n번까지만 반복되도록 배열을 정리하는 함수를 작성해야 합니다. 여기서 중요한 조건은 원하는 요소들의 상대적인 순서를 유지한 채, 제자리에서(in-place) 배열을 직접 수정해야 한다는 점입니다.문제 해결 접근 방식핵심 아이디어는 객체(해시맵)를 활용해 각 요소의 등장 횟수를 추적하는 것입니다. 배열을 순회하는 도중 특정 요소의 등장 횟수가 허용된 최대치 n에 도달하면, splice() 메서드로 해당 요소를 제거합니다.splice(i, 1)로 요소를 삭제하면 뒤에 있던 요소들
문자열이나 숫자 리터럴로 구성된 배열에 다음과 같이 중복된 값이 포함되어 있다고 가정해 보겠습니다.const array = [day, night, afternoon, night, noon, night, noon, day, afternoon, day, night];여기서 우리는 groupSimilar()라는 함수를 작성해야 합니다. 이 함수는 위와 같은 배열을 입력받아, 반복되는 요소들을 하위 배열의 첫 번째 요소로 묶고, 원본 배열에서 해당 값이 등장한 총 횟수를 두 번째 요소로 담은 새로운 배열을 반환해야 합니다.따라서 위 예제의
문자열을 첫 번째이자 유일한 인수로 받아, 해당 문자열에 포함된 고유한(unique) 문자들을 키로 가지는 객체를 생성하는 함수를 작성해야 합니다. 이때 각 키의 값은 기본적으로 0으로 설정됩니다.예를 들어 다음과 같습니다.// 입력 문자열이 다음과 같다면:const str = hello world!;// 출력 결과는 다음과 같아야 합니다:const obj = {h: 0, e: 0, l: 0, o: 0, : 0, w: 0, r: 0, d: 0, !: 0};그럼 이 함수의 코드를 직접 작성해 보겠습니다.구현 아이디어핵심 로직은 매우
문제 상황다음과 같은 객체 배열이 있다고 가정해 보겠습니다.const arr = [ { value: 12, gap: 1 }, { value: 13, gap: 1 }, { value: 14, gap: 1 }, { value: 15, gap: 1 }, { value: 19, gap: 2 }, { value: 21, gap: 1 }, { value: 22, gap: 1 }, { value: 23, gap: 1 }, { value: 27, gap: 1 }, { valu
문제 소개다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.const array = [3.1, 1, 2.2, 5.1, 6, 7.3, 2.1, 9];우리는 주어진 숫자를 기준으로, 배열 안의 요소 중 해당 숫자보다 작은 요소와 큰 요소가 각각 몇 개인지 세는 함수를 작성해야 합니다.예를 들어 기준 숫자가 5.25라면, 다음 5개의 요소는 이 숫자보다 작습니다.(3.1, 1, 2.2, 5.1, 2.1)반대로 다음 3개의 요소는 이 숫자보다 큽니다.(6, 7.3, 9)참고 − 만약 어떤 요소가 주어진 숫자와 정확히 같다면, 그 요소는 큰
숫자 배열을 입력받아 요소들을 가장 큰 값 → 가장 작은 값 → 두 번째로 큰 값 → 두 번째로 작은 값 순서로 재배치하는 함수 minMax()를 작성해 보겠습니다.문제 이해하기예를 들어 다음과 같은 입력 배열이 있다고 가정해 봅시다.// 입력 배열: const input = [1, 2, 3, 4, 5, 6, 7] // 기대되는 출력 결과: const output = [7, 1, 6, 2, 5, 3, 4]즉, 정렬된 배열에서 가장 큰 값과 가장 작은 값을 번갈아 배치하다 보면, 마지막에 남은 중간값이 자연스럽게 배열의 끝에 위치하게
중첩된 객체를 인자로 받아, 모든 키의 값이 동일한지 여부에 따라 불리언(true/false)을 반환하는 함수(예: isSame())를 작성해야 한다고 가정해 보겠습니다.여기서 모든 키란 최하위 키들을 의미합니다. 즉, 어떤 키의 값이 중첩 객체라면 그 객체의 끝까지 재귀적으로 탐색하여 실제 값을 확인해야 합니다.문제 이해하기예를 들어 다음과 같은 객체가 있다고 가정해 봅시다.const obj = { a: 1, b: 1, c: { aa: 1 } };이 경우 모든 최하위 키(a, b, c.a