이 글에서는 JavaScript를 사용해 임의의 문자열을 모스 부호(Morse Code)로 변환하는 방법을 단계별로 소개합니다. 모스 부호란 무엇인가? 모스 부호는 전기 통신에서 텍스트 문자를 점(dot)과 대시(dash)라고 불리는 두 가지 신호 길이의 표준화된 조합으로 인코딩하는 방식입니다. 짧은 점과 긴 대시의 나열로 알파벳과 숫자를 표현하며, 오랫동안 무선 통신 분야의 핵심 소통 수단으로 활용되어 왔습니다. 특정 문자열을 모스 부호로 변환하는 함수를 만들려면 먼저 모든 영어 알파벳을 해당 모스 부호에 매핑하는 객체가 필요합니
자바스크립트에서 두 개의 배열이 있을 때, 한 배열을 다른 배열과 비교하여 마스터(master) 배열의 요소가 키(keys) 배열에 존재하는지 확인해야 하는 경우가 있습니다. 그 결과로 마스터 배열과 길이가 같은 새로운 배열을 만들되, 키 배열에 존재하는 값은 true, 존재하지 않는 값은 false로 채워 넣는 것이 목표입니다.예를 들어, 두 배열이 다음과 같다고 가정해 보겠습니다.const master = [3,9,11,2,20]; const keys = [1,2,3];그렇다면 최종적으로 만들어져야 할 배열은 다음과 같습니다.c
자바스크립트 개발을 하다 보면 배열 안에 또 다른 배열이 중첩된 형태의 데이터를 자주 만나게 됩니다. 이번 글에서는 중첩 배열에 포함된 모든 숫자의 합계를 구하는 함수를 작성해 보겠습니다.여기서 한 가지 조건이 있습니다. 바로 Array.prototype.flat() 메서드를 사용하지 않고 문제를 해결해야 한다는 점입니다. 대신 재귀 함수(Recursion)를 활용하면 깔끔하게 처리할 수 있습니다.재귀를 활용한 풀이 접근 방식핵심 아이디어는 간단합니다. 배열의 각 요소를 하나씩 순회하면서, 해당 요소가 배열인지 확인하고,요소가 배열
이번 글에서는 하나의 숫자를 입력받아, 해당 숫자의 각 자릿수를 역순으로 담고 있는 숫자 배열을 반환하는 함수를 작성해 보겠습니다.문제를 해결하는 접근 방식은 다음과 같습니다. 먼저 숫자를 String()으로 문자열로 변환하고, split() 메서드를 사용해 개별 자릿수 문자열의 배열로 분리합니다. 그다음 map()을 이용해 각 요소를 숫자형으로 변환한 뒤, reverse()로 배열을 뒤집어 최종 결과를 반환하면 됩니다.구현 코드다음은 숫자를 입력받아 역순 배열로 변환하는 함수입니다.const reversifyNumber = (nu
두 개의 문자열 배열이 있다고 가정해 보겠습니다. 그중 하나의 배열을 알파벳순으로 정렬하려는데, 만약 이 배열 안에 다른 배열에도 포함된 단어들이 있다면 그 단어들은 맨 앞에 배치하고, 나머지 요소들만 알파벳순으로 정렬해야 합니다. 이를 위해 excludeSorting(arr, ex) 함수를 작성해 보겠습니다. 여기서 arr은 정렬 대상 배열이고, ex는 arr에 존재할 경우 맨 앞에 위치해야 하는 단어들의 배열입니다. 예제 코드 const arr = [apple, cat, zebra, umbrella, disco, ball, le
배열에는 참(truthy)과 거짓(falsy) 값이 섞여 있을 수 있습니다. 이번 글에서는 원본 배열에서 NaN에 해당하는 요소들의 인덱스를 담은 새로운 배열을 반환하는 함수를 작성해 보겠습니다.NaN !== NaN이라는 특수한 성질 활용하기NaN의 데이터 타입은 사실 number입니다. NaN은 거짓(falsy) 값이지만, 다른 어떤 데이터 타입이나 변수와도 다른 독특한 성질을 가지고 있습니다. 바로 NaN === NaN 표현식이 false를 반환한다는 점입니다. 자기 자신과 같지 않은 유일한 값이 바로 NaN입니다.이러한 동작
이름에서 유추할 수 있듯이, intToRoman() 함수는 인자로 전달받은 정수에 해당하는 로마 숫자 문자열을 반환하는 역할을 합니다. 이번 글에서는 이 함수를 JavaScript로 직접 구현해 보겠습니다.동작 원리로마 숫자는 I(1), V(5), X(10), L(50), C(100), D(500), M(1000)이라는 기본 기호로 구성됩니다. 또한 4와 9처럼 작은 기호가 큰 기호 앞에 오는 감산 표기(IV, IX, XL, XC, CD, CM)도 존재합니다.따라서 변환 로직은 다음과 같습니다. 숫자가 0이 될 때까지 반복문을 돌면
이 글에서는 로마 숫자 문자열을 입력받아 해당하는 십진수(10진법) 값을 반환하는 JavaScript 함수를 작성해 보겠습니다. 로마 숫자는 I(1), V(5), X(10), L(50), C(100), D(500), M(1000)의 일곱 가지 기호로 표현되며, 작은 값의 기호가 큰 값의 기호 앞에 올 경우 뺄셈으로 처리한다는 것이 핵심 규칙입니다. 예를 들어 IV는 4, IX는 9를 의미합니다. 알고리즘 동작 원리 이 알고리즘은 문자열을 왼쪽부터 검사하면서 다음 규칙에 따라 값을 누적합니다. 현재 기호가 바로 뒤의 기호보다 값이
두 개의 객체를 입력받아 하나의 객체로 병합하고, 동일한 키를 가진 값들은 서로 더하는 함수를 작성해야 합니다. 이때 선형 시간(O(n))과 상수 공간 안에서 처리해야 하며, 이는 최대 한 번의 루프만 사용하고 기존 객체의 속성을 그대로 활용하여 새로운 변수나 객체를 추가로 생성하지 않는다는 의미입니다. 접근 방식 핵심 아이디어는 간단합니다. 첫 번째 객체(obj1)의 모든 키를 순회하면서, 두 번째 객체(obj2)에 같은 키가 존재하는지 확인합니다. 존재한다면 obj1의 해당 값에 obj2의 값을 누적해서 더해줍니다. 이렇게 하면
문제 정의배열과 검색어(query)를 인자로 받아, 중첩 배열 전체를 재귀적으로 탐색한 뒤 해당 검색어가 등장하는 횟수를 반환하는 searchRecursively() 함수를 작성해야 합니다.예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.const names = [rakesh, [kalicharan, krishna, rakesh, james, [michael, nathan, rakesh, george]]];이 상태에서 아래와 같이 함수를 호출하면 −searchRecursively(names, rakesh);ra
배열을 입력받아 연속으로 반복되는 같은 숫자들을 하나로 합산한 새로운 배열을 반환하는 함수를 작성해야 한다고 가정해 보겠습니다.예를 들어 다음과 같은 배열이 있다고 합시다.const array = [1, 5, 5, 5, 8, 8, 9, 1, 4, 4, 2];이때 기대하는 출력 결과는 다음과 같습니다.[1, 15, 16, 9, 1, 8, 2]연속된 세 개의 5는 15로 합쳐지고, 연속된 두 개의 8은 16으로, 마찬가지로 연속된 두 개의 4는 8로 합산됩니다. 중간에 다른 숫자가 끼어 있으면(예: 9와 1) 각각 그대로 유지됩니다.해
JavaScript로 개발을 하다 보면 문자열 배열에서 가장 긴 단어와 가장 짧은 단어를 동시에 찾아야 하는 경우가 종종 있습니다. 이번 글에서는 Array.prototype.reduce() 메서드를 활용해 한 번의 순회만으로 두 값을 모두 구하는 방법을 알아보겠습니다.문제 상황다음과 같은 문자열 리터럴 배열이 있다고 가정해 보겠습니다.const arr = [Some, random, words, that, actually, form, a, sentence.];이 배열에서 가장 긴 단어와 가장 짧은 단어를 각각 반환하는 함수를 작성해
숫자 n을 입력받아 피보나치 수열의 첫 n개 항을 배열로 반환하는 재귀 함수 fibonacci()를 작성해 보겠습니다. 아래 코드는 매개변수 기본값과 재귀 호출을 활용해 간결하게 구현한 예시입니다. 코드 예제 const fibonacci = (n, res = [], count = 1, last = 0) => { if(n){ return fibonacci(n-1, res.concat(count), co
문제 소개숫자를 하나 입력받아 해당 숫자가 회문(palindrome)인지 아닌지에 따라 불리언(Boolean) 값을 반환하는 함수를 작성해 보겠습니다. 이때 중요한 제약 조건이 있습니다. 바로 숫자를 문자열이나 다른 데이터 타입으로 변환하지 않고 문제를 해결해야 한다는 것입니다.회문 숫자란 앞에서부터 읽어도 뒤에서부터 읽어도 동일하게 읽히는 숫자를 의미합니다.예를 들면 다음과 같습니다.12134312321그렇다면 이러한 조건을 만족하는 함수의 코드를 직접 작성해 보겠습니다.구현 예제const isPalindrome = (num) =
이번 글에서는 숫자 n을 인자로 받아, n 이하의 모든 짝수의 합을 반환하는 재귀 함수를 자바스크립트로 작성하는 방법을 알아보겠습니다.접근 방식재귀 함수를 활용하면 반복문 없이도 문제를 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.입력값이 홀수라면 가장 가까운 짝수로 조정합니다.현재 짝수를 누적합에 더한 뒤, 2를 뺀 값으로 함수를 다시 호출합니다.num이 0이 되면 재귀를 종료하고 지금까지 누적된 합을 반환합니다.코드 예제 { num = num % 2 === 0 ? num : num - 1; if(num){
문제 개요숫자로 이루어진 배열과 하나의 숫자를 입력받아, 배열 안에서 해당 숫자가 나타나는 모든 항목을 제자리(in-place)에서 제거하는 함수를 작성해야 합니다. 여기서 제자리란 새로운 배열을 만들지 않고 원본 배열 자체를 직접 수정한다는 의미입니다.재귀(Recursion)를 활용한 해결 방법이 문제는 재귀 함수를 사용하면 깔끔하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.먼저 indexOf() 메서드로 배열에서 해당 숫자가 처음 등장하는 위치를 찾습니다. 만약 존재한다면(-1이 아니라면) splice() 메서드로 그
JavaScript에서 배열 내 특정 값이 n번째로 등장하는 위치를 찾아야 하는 경우가 종종 있습니다. 예를 들어, 배열 안에 동일한 구분자가 여러 번 반복될 때 그중 원하는 순서의 위치를 알아내야 할 수 있죠.이번 글에서는 배열 arr, 문자열 또는 숫자 리터럴 txt, 그리고 숫자 n을 인자로 받는 함수 getIndex()를 작성해 보겠습니다. 이 함수는 txt가 배열 arr에서 n번째로 나타나는 인덱스를 반환하며, 만약 txt가 n번 이상 등장하지 않는다면 -1을 반환해야 합니다.구현 예제reduce() 메서드를 활용하면 배열
이 글에서는 배열의 배열을 인자로 받아, 원본 배열에 담긴 모든 요소를 하나로 모으되 중복된 항목은 제거하고 고유한 값만 남긴 새로운 배열을 반환하는 JavaScript 함수를 만들어 보겠습니다.문제 정의예를 들어 다음과 같은 입력이 주어졌다고 가정해 봅시다.const arr = [ [12, 45, 65, 76, 76, 87, 98], [54, 65, 98, 23, 78, 9, 1, 3], [87, 98, 3, 2, 123, 877, 22, 5, 23, 67] ];기대하는 출력은 여러 배열에 흩어져 있던 요소들
배열을 입력받아 positive와 negative라는 두 개의 속성을 가진 객체를 반환하는 함수를 작성해야 합니다. 각 속성은 원본 배열에서 양수 요소들과 음수 요소들을 각각 담고 있는 배열이어야 합니다.이 문제는 생각보다 간단합니다. Array.prototype.reduce() 메서드를 활용하면 원하는 요소들을 골라내어 두 개의 배열을 가진 객체에 깔끔하게 담을 수 있습니다.동작 원리reduce() 메서드는 누적값(accumulator)으로 초기 객체 { positive: [], negative: [] }를 사용합니다. 배열의 각
문자열과 숫자가 혼합된 배열이 있을 때, NaN 값이 항상 맨 뒤에 위치하도록 정렬하는 함수를 작성해야 하는 경우가 있습니다. 목표는 일반적인 숫자들이 먼저 나오고, 그다음에 문자열 리터럴이, 마지막에 NaN 값들이 오도록 배열을 정렬하는 것입니다.여기서 주의할 점이 있습니다. JavaScript에서 NaN의 데이터 타입은 "number"이기 때문에 !number && !string 같은 방식으로는 NaN을 판별할 수 없습니다. 또한 요소의 참/거짓(truthy/falsy) 여부만으로 판단하면 빈 문