JavaScript 개발을 하다 보면 2차원 배열의 데이터를 특정 기준에 따라 그룹화해야 하는 경우가 자주 발생합니다. 이번 글에서는 색상과 과일 데이터가 담긴 2차원 배열을 카테고리별 객체 배열로 변환하는 방법을 알아보겠습니다.예를 들어, 다음과 같이 과일과 색상 정보가 담긴 2차원 배열이 있다고 가정해 보겠습니다.const data = [ [orange, fruit], [red, color], [green, color], [orange, color], [banana, fruit], [b
문제 개요숫자로 이루어진 배열과 목표 합(target sum)을 인수로 받아, 배열 안에서 세 수의 합이 목표 합과 정확히 일치하는 조합이 존재하는지 확인하는 함수 threeSum()을 작성해야 합니다. 조건을 만족하는 세 요소가 존재하면 해당 요소들의 인덱스를 배열 형태로 반환하고, 존재하지 않으면 -1을 반환합니다.접근 방법핵심 아이디어는 간단합니다. 널리 알려진 Two Sum 문제 해결 기법을 재활용하는 것입니다.먼저 twoSum() 함수를 작성합니다. 이 함수는 배열과 목표 합을 받아, 합이 목표 값과 일치하는 두 요소의 인
두 개의 숫자 배열이 주어졌을 때, 두 배열의 교집합을 계산하여 공통 요소들을 담은 배열을 반환하는 함수(예: intersection())를 작성해야 합니다. 이때 결과 배열의 각 요소는 두 배열에 나타난 횟수만큼 포함되어야 합니다.예를 들어 다음과 같습니다.입력: arr1 = [1,2,3,1], arr2 = [1,3,1]출력: [1,3,1]접근 방법만약 두 배열이 이미 정렬되어 있다면 투 포인터(two pointer) 기법을 활용할 수 있습니다. 각 포인터를 두 배열의 시작 지점(인덱스 0)에 위치시킨 후, 조건에 따라 포인터를
Ruby의 each_cons() 메서드란?Ruby의 each_cons()는 Enumerable(열거형)에 내장된 메서드로, 각 요소를 시작점으로 삼아 연속된 N개의 요소를 순회합니다. 블록이 주어지지 않으면 열거자(enumerator)를 반환합니다.each_cons()의 JavaScript 버전숫자 배열이 있다고 가정해 보겠습니다(여기서는 Ruby의 Enumerable에 해당하는 개념입니다). eachCons 함수는 배열의 각 요소에 대해 실행되며, 유일한 인자로 숫자 N(N은 배열 길이 이하)을 받습니다. 그리고 크기가 N인 하위
JavaScript에서 나비 셔플(butterfly shuffle)된 배열이란 숫자들이 나비 날개처럼 대칭 구조를 이루도록 정렬된 배열을 말합니다. 배열의 중앙으로 갈수록 숫자가 작아지고, 끝으로 갈수록 다시 커지는 형태로, 가장 큰 숫자가 첫 번째 인덱스에 위치합니다.또 다른 변형 형태로는 중앙으로 갈수록 숫자가 커지고 끝으로 갈수록 작아지는 경우도 있습니다. 이 경우에는 가장 작은 숫자가 첫 번째 인덱스에 놓입니다.수학적 배경을 가진 분들이라면 이 패턴이 가우시안 분포(Gaussian distribution)와 비슷하게 느껴질
중첩 객체에 깊이 속성 할당하기실무에서는 다음과 같이 객체 배열 안에 또 다른 객체들이 중첩되어 있는 트리 형태의 데이터 구조를 자주 다루게 됩니다.const arr = [{ id: 0, children: [] }, { id: 1, children: [{ id: 2, children: [] }, { id: 3, children: [{ id: 4, children: [] }] }] }];여기서 우리가 해야 할 작업은 assignDepth()라
문제 정의 여러 스포츠 종목에 참가한 선수들의 점수를 담은 배열이 있다고 가정해 보겠습니다. 각 객체는 종목명(sport)과 선수별 점수를 키-값 쌍으로 저장하고 있으며, 데이터는 다음과 같이 표현됩니다. const scores = [ {sport: cricket, aman: 54, vishal: 65, jay: 43, hardik: 88, karan:23}, {sport: soccer, aman: 14, vishal: 75, jay: 41, hardik: 13, karan:73}, {sport: hockey,
문자열을 입력받아 그 안의 알파벳을 거울처럼 뒤집는(미러링하는) 함수를 만들어 보겠습니다. 동작 방식은 다음과 같습니다.입력값이 abcd라면출력값은 zyxw가 되어야 합니다.이 함수의 핵심 원리는 간단합니다. 각 문자를 자신으로부터 (26 - N)번째 떨어진 알파벳으로 매핑하는 것입니다. 여기서 N은 해당 알파벳의 1부터 시작하는 인덱스를 의미합니다. 예를 들어 e는 5번째, j는 10번째 알파벳입니다.구현에는 String.prototype.replace() 메서드를 활용합니다. 정규표현식을 함께 사용하면 대소문자 구분 없이 모든
이번 글에서는 객체와 문자열 배열을 인자로 받아, 배열에 포함된 키만 남긴 필터링된 새로운 객체를 반환하는 함수를 작성해 보겠습니다.예를 들어, 객체가 {a: [], b: [], c: [], d: []}이고 배열이 [a, d]라면, 결과는 다음과 같아야 합니다.{a: [], d: []}구현 아이디어핵심 로직은 간단합니다. 객체의 모든 키를 순회하면서 해당 키가 배열에 존재하는지 확인하고, 존재한다면 그 키-값 쌍을 새로운 객체에 추가합니다. 순회가 끝나면 완성된 새 객체를 반환하면 됩니다.코드 예제const capitals = {
문제 상황양수와 음수, 그리고 짝수와 홀수가 섞여 있는 숫자 배열이 있다고 가정해 보겠습니다. 이 배열을 오름차순으로 정렬하되, 다음 조건을 만족해야 합니다.모든 짝수는 어떤 홀수보다도 앞에 위치해야 합니다.짝수 그룹과 홀수 그룹 각각의 내부에서도 오름차순 정렬이 유지되어야 합니다.예를 들어, 입력 배열이 다음과 같다면 −const arr = [-2,3,6,-12,9,2,-4,-11,-8];기대하는 출력 결과는 다음과 같습니다 −[ -12, -8, -4, -2, 2, 6, -11, 3, 9]해결 방법: 커스텀
JavaScript에는 배열에서 특정 값을 제거하는 전용 메서드가 기본적으로 제공되지 않습니다. 이번 글에서는 배열 프로토타입에 추가할 수 있는 커스텀 함수 Array.prototype.remove()를 직접 구현해 보겠습니다. 요구 사항 remove() 함수는 다음 조건을 충족해야 합니다. 인자로 콜백 함수 또는 배열의 요소가 될 수 있는 값 하나를 받습니다. 인자가 함수라면, 그 함수의 반환값을 배열에서 찾아야 할 대상 요소로 간주합니다. 조건에 맞는 요소를 원본 배열에서 직접(in-place) 찾아 삭제합니다. 요소를 찾아
JavaScript에서 두 개의 배열을 인자로 받는 함수 findPositions()를 작성해야 한다고 가정해 봅시다. 이 함수는 첫 번째 배열에 존재하는 두 번째 배열 요소들의 모든 인덱스를 배열 형태로 반환해야 합니다.문제 예시예를 들어 다음과 같은 배열이 있다고 해보겠습니다.첫 번째 배열: [john, doe, chris, snow, john, chris]두 번째 배열: [john, chris]이 경우 출력 결과는 다음과 같아야 합니다.[0, 2, 4, 5]john은 인덱스 0과 4에 위치하고, chris는 인덱스 2와 5에
이번 글에서는 알파벳과 숫자가 섞여 있는 문자열을 입력받아, 알파벳으로만 구성된 새로운 문자열을 반환하는 재귀 함수를 작성해 보겠습니다. 함수 이름은 pickString이라고 하겠습니다.문제 이해하기예를 들어 다음과 같은 문자열이 주어졌다고 가정해 봅시다.입력: dis122344as65t34er출력: disaster즉, 문자열을 한 글자씩 순회하면서 숫자는 제거하고 알파벳(그리고 공백)만 결과 문자열에 이어 붙이면 됩니다. 반복문 대신 재귀 호출을 활용해 이 문제를 해결할 수 있습니다.구현 코드재귀 함수의 핵심은 세 가지입니다.현재
이번 글에서는 두 개의 숫자 m과 n을 인수로 받아, 두 수 사이에 있는 모든 짝수의 합(두 수 포함)을 반환하는 함수를 작성해 보겠습니다.문제 이해하기예를 들어 다음과 같은 경우를 생각해 볼 수 있습니다.m = 10, n = -4인 경우이때 출력 결과는 다음과 같아야 합니다.10 + 8 + 6 + 4 + 2 + 0 + (-2) + (-4) = 24여기서 중요한 점은 m과 n의 크기 관계가 정해져 있지 않다는 것입니다. 즉, m이 n보다 클 수도 있고 작을 수도 있으며, 음수가 포함될 수도 있습니다.접근 방법모든 짝수를 하나씩 순회
실무에서 객체 배열로 이루어진 데이터를 다루다 보면, 배열 안의 여러 객체가 공통으로 가지고 있는 숫자 속성의 평균값을 구해야 하는 경우가 자주 있습니다. 예를 들어 사용자 목록에서 평균 나이를 계산하거나, 상품 목록에서 평균 가격을 구하는 작업이 대표적입니다.문제 상황다음과 같이 사람 정보를 담은 객체 배열이 있다고 가정해 보겠습니다. 각 객체는 name과 age라는 속성을 가지고 있습니다.const people = [ { name: Anna, age: 22 }, { nam
자바스크립트(JavaScript)에서 문자열의 첫 번째 문자부터 시작해 매 두 번째 문자를 제거하고, 제거된 문자들을 모두 문자열 끝에 이어 붙이는 함수를 작성해 보겠습니다. 이 작업은 본질적으로 문자열을 홀수 인덱스 문자와 짝수 인덱스 문자로 분리한 뒤 순서를 바꿔 합치는 것과 같습니다. 문제 이해하기 먼저 예시를 통해 동작 방식을 확인해 보겠습니다. 입력 문자열: This is a test! 변환 결과: hsi etTi sats! 즉, 인덱스가 홀수인 문자들(두 번째, 네 번째, 여섯 번째 문자 등)을 먼저 모아 앞쪽에 배치하
프로그래밍을 하다 보면 숫자 배열에서 특정 조건을 만족하는 요소들을 추출해야 하는 경우가 자주 있습니다. 이번 글에서는 배열 전체 합계를 기준으로, 주어진 퍼센트 이하가 될 때까지 앞쪽 요소들을 순서대로 모으는 함수를 JavaScript로 구현해 보겠습니다. 문제 정의 다음과 같은 숫자 리터럴 배열이 있다고 가정해 봅시다. const numbers = [10, 6200, 20, 20, 350, 900, 26, 78, 888, 10000, 78, 15000, 200, 1280, 2000, 450]; 우리가 작성할 함수는 두 개
숫자로 이루어진 배열을 인수로 받아, 현재 계산 중인 인덱스를 제외한 나머지 숫자들의 곱을 담은 새로운 배열을 반환하는 함수를 작성해야 한다고 가정해 보겠습니다. 예를 들어, arr에 5개의 인덱스가 있고 인덱스 1의 값을 만든다면, 인덱스 0, 2, 3, 4에 있는 숫자들이 서로 곱해집니다. 마찬가지로 인덱스 2의 값을 만들 때는 인덱스 0, 1, 3, 4의 숫자들을 곱하는 식으로 진행됩니다. 참고 − 배열 안의 모든 요소는 0이 아니라고 보장되어 있습니다. 접근 방법 가장 효율적인 방법은 배열을 두 단계로 처리하는 것
문자열을 유일한 인자로 받아서, 그에 해당하는 숫자를 반환하는 함수를 작성해야 합니다.예를 들면 다음과 같습니다.one five seven eight -------> 1578Two eight eight eight -------> 2888이 문제는 생각보다 간단합니다. 핵심 아이디어는 다음과 같습니다.해결 접근 방식먼저 입력 문자열을 공백을 기준으로 분리하여 단어 배열을 만듭니다. 그다음 각 단어가 zero부터 nine까지의 어느 숫자 단어에 해당하는지 찾아내고, 해당 숫자를 결과값에 차례대로 더해 나갑니다.각 자릿수를
나르시시스트 수(Narcissistic Number)란?나르시시스트 수(자화수라고도 불림)는 주어진 진법 b에서, 각 자릿수를 자릿수의 개수만큼 거듭제곱한 값들을 모두 더했을 때 원래의 수와 같아지는 수를 의미합니다.예를 들어 다음과 같습니다.153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153마찬가지로 한 자릿수인 경우도 확인할 수 있습니다.1 = 1^1 = 1해결 접근 방법먼저 while 루프를 사용하여 숫자의 자릿수 개수를 셉니다. 그다음 또 다른 while 루프를 돌면서 숫자의 마지막 자릿수를 하나씩