카이사르 암호(Caesar Cipher) 알고리즘이란?카이사르 암호는 역사상 가장 오래되고 널리 알려진 암호화 기법 중 하나로, 로마 황군 율리우스 카이사르의 이름에서 유래했습니다. 평문(plaintext)의 각 알파벳 문자를 알파벳 순서상 일정한 거리만큼 떨어진 다른 문자로 치환하는 대체 암호(substitution cipher)의 한 종류입니다.예를 들어, 왼쪽으로 3칸 이동(shift)하는 경우 D는 A로, E는 B로 바뀌는 식입니다.여기서는 두 개의 인수를 받는 자바스크립트 함수를 작성해야 합니다.첫 번째 인수: 암호화할 문
기수 정렬(Radix Sort)이란?기수 정렬은 정수 키를 가진 데이터를 정렬하는 비교 기반이 아닌 알고리즘입니다. 숫자를 일의 자리, 십의 자리, 백의 자리처럼 각 자릿수별로 나누어, 같은 자릿수와 값을 공유하는 키끼리 그룹(버킷)으로 묶는 방식으로 정렬을 수행합니다.비교 연산 없이 자릿수만 반복적으로 확인하기 때문에, 데이터 범위가 적절한 경우 매우 빠른 성능을 보여줍니다. 시간 복잡도는 O(d × (n + b))로, 여기서 d는 최대 자릿수, n은 요소 개수, b는 진법(기수)입니다.구현 목표리터럴 값으로 이루어진 배열 하나를
두 개의 문자열을 입력받아, 두 문자열 모두에 공통으로 등장하는 가장 긴 연속 부분 문자열(Longest Common Substring)을 찾아 반환하는 JavaScript 함수를 작성해야 합니다. 여기서 중요한 점은 부분 문자열이 반드시 원본 문자열에서 연속된 형태로 나타나야 한다는 것입니다.문제 예시예를 들어, 입력 문자열이 다음과 같다고 가정해 보겠습니다.const str1 = ABABC; const str2 = BABCA;이 경우 함수가 반환해야 할 결과는 다음과 같습니다.const output = BABC;BABC는 str
양수와 음수가 섞여 있는 정수 배열이 주어졌을 때, 연속된 요소들의 합이 가장 큰 부분 배열을 찾는 JavaScript 함수를 작성해야 합니다.배열에 음수가 포함되어 있기 때문에 연속 요소들의 합은 양수일 수도 있고 음수일 수도 있습니다. 따라서 단순히 모든 요소를 더하는 것으로는 최댓값을 구할 수 없으며, 합이 가장 커지는 구간만 골라내야 합니다. 최종적으로 함수는 해당 부분 배열 자체를 반환해야 합니다.문제 예시입력 배열이 다음과 같다고 가정해 보겠습니다.const arr = [-2, -3, 4, -1, -2, 1, 5, -3]
문제 소개두 개의 리터럴 배열(arr1, arr2)을 입력으로 받아, 두 배열에 공통으로 나타나는 가장 긴 요소 시퀀스, 즉 최장 공통 부분 수열(Longest Common Subsequence)을 찾는 JavaScript 함수를 작성해 보겠습니다. 함수는 최종적으로 해당 요소들을 배열 형태로 반환해야 합니다.예시입력 배열이 다음과 같다고 가정해 봅시다.const arr1 = [a, b, c, d, e]; const arr2 = [k, j, b, c, d, w];이 경우 출력 결과는 다음과 같아야 합니다.const output =
JavaScript에서 Math.sqrt() 메서드를 사용하지 않고 숫자의 제곱근을 계산해야 하는 경우가 있습니다. 이 글에서는 양의 정수를 인수로 받아 해당 숫자의 제곱근을 찾아 반환하는 함수를 직접 구현하는 방법을 알아보겠습니다.접근 방식: 뉴턴-랩슨 법이 문제는 뉴턴-랩슨 법(Newton-Raphson method), 즉 소위 바빌로니아 법이라 불리는 수치 해석 기법을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.제곱근의 근삿값을 반복적으로 개선해 나가는 방식으로, 현재 추정값 res에 대해 다음
양의 정수 n의 분할(partition)이란 n을 하나 이상의 양의 정수 합으로 표현하는 방법을 의미합니다. 이때 덧셈 순서만 다른 두 식은 같은 분할로 간주합니다.예를 들어, 4는 다음과 같이 다섯 가지 방법으로 분할할 수 있습니다.43 + 12 + 22 + 1 + 11 + 1 + 1 + 1문제 정의양의 정수 하나를 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 해당 정수를 분할할 수 있는 모든 경우의 수를 계산하여 반환해야 합니다.접근 방식: 동적 프로그래밍(Dynamic Programming)이 문제는 동
이메일 마스킹이란?웹사이트에서 사용자의 개인 이메일 주소를 그대로 노출하면 스팸 수신이나 개인정보 유출의 위험이 있습니다. 따라서 많은 웹사이트에서는 이메일 주소의 일부를 가리는 마스킹(masking) 기법을 활용해 개인정보를 보호합니다.예를 들어 다음과 같은 이메일 주소가 있다고 가정해 보겠습니다.const email = ramkumar@example.com;마스킹을 적용하면 화면에는 아래와 같이 표시됩니다.r...r@example.com즉, 이름(로컬 파트)의 첫 글자와 마지막 글자만 남기고 중간 부분은 ...으로 대체하는 방식
중복 없는 후보 숫자 배열(candidates)과 목표 숫자(target)가 주어졌다고 가정해 보겠습니다.우리가 작성해야 할 함수는, 후보 숫자들을 더했을 때 목표 숫자가 되는 모든 고유한 조합을 찾아내는 것입니다.여기서 흥미로운 점은 같은 숫자를 제한 없이 몇 번이고 반복해서 선택할 수 있다는 것입니다.문제 조건모든 숫자(목표 숫자 포함)는 양의 정수입니다.결과 집합에는 중복된 조합이 포함되어서는 안 됩니다.예시다음과 같은 입력이 주어졌을 때 −candidates = [2,3,6,7], target = 7,정답은 다음과
최소 공배수(LCM, Least Common Multiple)란 두 정수 a와 b가 주어졌을 때, 두 수 모두로 나누어 떨어지는 가장 작은 양의 정수를 의미합니다.예시 −4와 6의 최소 공배수는 12입니다. 12는 4와 6으로 각각 나누었을 때 나머지 없이 딱 떨어지는 가장 작은 수이기 때문입니다.이번 글에서는 두 개의 숫자를 입력받아 해당 숫자들의 최소 공배수를 계산하고 반환하는 JavaScript 함수를 작성해 보겠습니다.최소 공배수를 구하는 원리최소 공배수를 구하는 가장 효율적인 방법은 최대 공약수(HCF)를 활용하는 것입니다
해밍 거리란 무엇인가?해밍 거리(Hamming Distance)는 길이가 같은 두 문자열에서 서로 다른 기호가 위치한 자리의 개수를 의미합니다. 즉, 같은 위치에 있는 문자들을 하나씩 비교했을 때 일치하지 않는 횟수를 세면 됩니다.예를 들어 다음과 같은 두 문자열이 있다고 가정해 보겠습니다.const str1 = delhi;const str2 = delph;이 두 문자열의 해밍 거리는 2입니다. 네 번째 문자(h와 p)와 다섯 번째 문자(i와 h)가 서로 다르기 때문입니다. 참고로 해밍 거리를 계산하려면 반드시 두 문자열의 길이가
블록 검색(Block Search)이란? 이진 탐색(Binary Search)과 마찬가지로 블록 검색 역시 정렬된 배열을 대상으로 하는 탐색 알고리즘입니다. 핵심 아이디어는 모든 요소를 하나씩 확인하는 선형 탐색 대신, 고정된 크기만큼 앞으로 점프하거나 일부 요소를 건너뛰어 확인해야 할 요소의 개수를 크게 줄이는 것입니다. 동작 원리 예를 들어 길이가 n인 배열 arr과 점프할 블록 크기 m이 있다고 가정해 보겠습니다. 그러면 다음과 같은 인덱스를 차례대로 확인합니다. arr[0] → arr[m] → arr[2 * m] → ...
문제 정의n개의 계단이 있고, 한 사람이 계단 아래에서 꼭대기까지 올라가려고 합니다. 이 사람은 한 번에 1칸 또는 2칸씩만 오를 수 있다고 가정합니다. 이때 꼭대기까지 도달할 수 있는 모든 방법의 수를 구하는 것이 이 문제의 목표입니다.즉, 계단의 개수를 나타내는 숫자 n을 입력받아, 계단을 오를 수 있는 경우의 수를 계산하여 반환하는 JavaScript 함수를 작성해야 합니다.접근 방식이 문제는 잘 알려진 피보나치 수열과 밀접한 관련이 있습니다. n번째 계단에 도달하는 방법은 다음 두 가지 경우의 합과 같습니다.(n-1)번째 계
라디안(Radian)이란?라디안은 각도를 측정하는 단위로, 수학의 여러 분야에서 표준 각도 단위로 사용됩니다. 라디안은 원의 반지름 길이와 호의 길이가 같아질 때의 중심각으로 정의되며, 180도는 π(파이) 라디안과 같습니다.이번 글에서는 숫자 형태의 각도(도)를 입력받아 그에 해당하는 라디안 값을 반환하는 자바스크립트 함수를 작성해 보겠습니다.변환 공식도(degree)를 라디안(radian)으로 변환하려면 다음 공식을 사용합니다.라디안 = 도 × (π / 180)자바스크립트에서는 내장 상수인 Math.PI를 활용하면 별도의 값 선
멱집합(Power Set)이란?집합 S의 멱집합(power set)은 S의 모든 부분집합을 원소로 가지는 집합으로, 공집합과 S 자기 자신까지 포함됩니다. 집합 S의 멱집합은 일반적으로 P(S)로 표기합니다.예시S = {x, y, z}일 때, 만들 수 있는 모든 부분집합은 다음과 같습니다.{ {}, {x}, {y}, {z}, {x
레벤슈타인 거리(Levenshtein Distance)란?레벤슈타인 거리는 두 문자열(시퀀스) 간의 차이를 측정하는 대표적인 문자열 메트릭입니다. 한 단어를 다른 단어로 변환할 때 필요한 최소 편집 횟수, 즉 단일 문자의 삽입(insertion), 삭제(deletion), 치환(substitution) 연산의 최솟값을 의미합니다.예시다음과 같은 두 문자열이 있다고 가정해 보겠습니다.const str1 = hitting;const str2 = kitten;이 두 문자열 간의 레벤슈타인 거리는 3입니다. 아래와 같은 세 번의 편집만으로
보간 검색(Interpolation Search)이란?보간 검색은 숫자 키 값을 기준으로 오름차순 정렬된 배열에서 특정 키(target)를 빠르게 찾아내는 탐색 알고리즘입니다. 이진 탐색(Binary Search)이 항상 배열의 중간 지점을 확인하는 것과 달리, 보간 검색은 찾으려는 값의 위치를 데이터의 분포를 기반으로 추정한다는 점이 큰 차이점입니다.특히 값들이 균등하게(uniformly) 분포되어 있는 정렬된 배열에서는 평균적으로 O(log log n)의 시간 복잡도를 보여, 이진 탐색(O(log n))보다 더 빠른 성능을 낼
JavaScript에서는 두 개의 문자열을 인자로 받아, 첫 번째 문자열(str1)이 두 번째 문자열(str2)로 시작하거나 끝나는지 판별하는 함수를 작성할 수 있습니다. 조건에 해당하면 true를, 그렇지 않으면 false를 반환하도록 구현합니다.구현 로직핵심 아이디어는 다음과 같습니다.str2가 str1보다 길다면 시작 또는 끝 부분과 일치할 수 없으므로 즉시 false를 반환합니다.두 문자열이 완전히 같다면 true를 반환합니다.그 외의 경우 str1의 앞부분(l2 길이만큼)과 뒷부분(l2 길이만큼)을 각각 잘라내어 str2와
문제 상황다음과 같이 도시의 날씨 정보를 담고 있는 객체가 있다고 가정해 보겠습니다.const obj = { city: New Delhi, maxTemp: 32, minTemp: 21, humidity: 78, aqi: 456, day: Tuesday, };이 객체를 입력으로 받아, 각 하위 배열이 정확히 두 개의 요소로 구성된 2차원 배열을 만드는 JavaScript 함수를 작성해야 합니다. 각 하위 배열에는 다음 두 가지가 들어가야 합니다.객체의 키(key)해당 키에 대응하는 값(val
JavaScript 개발을 하다 보면 배열 안에 여러 개의 하위 배열이 들어 있는 형태의 데이터를 자주 접하게 됩니다. 이런 구조는 각 하위 배열이 하나의 키-값 쌍을 나타내는 경우가 많은데요, 실무에서는 이를 다루기 쉬운 객체(Object) 형태로 변환해야 할 때가 많습니다.문제 상황예를 들어, 크리켓 선수의 경기 기록이 아래와 같이 배열의 배열 형태로 저장되어 있다고 가정해 보겠습니다.const arr = [ [Name, V Kohli], [Matches, 13], [Runs, 590], [Highe