JavaScript의 Atomics 객체는 add(덧셈), sub(뺄셈), and(비트 AND), or(비트 OR), xor(비트 XOR), load(읽기), store(쓰기)와 같은 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 객체입니다. 이 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 동시에 동일한 메모리에 접근할 때 데이터 일관성이 깨지는 경합 조건(race condition)을 방지해 줍니다. Atomics.and() 함수는 배열에서 연산을 수행할 위치(index)를 나타내는
JavaScript의 Atomics 객체는 add(덧셈), sub(뺄셈), and, or, xor, load, store 등과 같은 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 내장 객체입니다. 이 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 공유 메모리에 동시에 접근할 때 발생할 수 있는 데이터 경합(race condition) 문제를 방지하는 역할을 합니다. Atomics.or() 함수는 배열의 특정 위치(index)를 나타내는 값을 인자로 받아, 해당 위치에 저장된 값과 지정한
JavaScript의 Atomics 객체는 여러 스레드가 공유 메모리에 안전하게 접근할 수 있도록 원자적(atomic) 연산을 제공하는 내장 객체입니다. add, sub, and, or, xor, load, store 같은 연산들이 정적(static) 메서드 형태로 제공되며, 이러한 메서드들은 주로 SharedArrayBuffer 객체와 함께 사용됩니다.Atomics.isLockFree()란?Atomics.isLockFree() 메서드는 주어진 바이트 크기에 대해 하드웨어 수준의 원자적 연산을 사용할 수 있는지, 아니면 소프트웨어
JavaScript의 Atomics 객체는 add(더하기), sub(빼기), and, or, xor, load(읽기), store(쓰기) 등 다양한 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 객체입니다. 이 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 동시에 공유 메모리에 접근할 때 발생할 수 있는 데이터 충돌 없이 안전하게 연산을 수행하도록 도와줍니다.Atomics.load() 함수는 타입 배열(Typed Array)에서 지정된 인덱스 위치에 저장된 값을 읽어 반환합니다. 일반적인
JavaScript의 Atomics 객체는 add(더하기), sub(빼기), and, or, xor, load(읽기), store(쓰기) 등 다양한 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 내장 객체입니다. 이러한 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 공유 메모리에 동시에 접근할 때 발생할 수 있는 데이터 경합(race condition) 문제를 방지해 줍니다.그중 store() 함수는 배열 내 특정 위치(인덱스)와 저장할 숫자 값을 인자로 받아, 지정된 위치에 해당 값을
자바스크립트의 Atomics 객체는 add, sub, and, or, xor, load, store 등과 같은 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 객체입니다. 이러한 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 공유 메모리에 동시에 접근할 때 발생할 수 있는 데이터 경합(race condition) 문제를 방지해 줍니다.Atomics 객체의 sub() 함수는 숫자와 위치(인덱스)를 인수로 받아, 해당 위치에 저장되어 있는 값에서 주어진 숫자를 뺀 후, 뺄셈 이전의 기존 값(o
최소 신장 트리(MST)란 무엇인가?최소 신장 트리(Minimum Spanning Tree, MST) 또는 최소 가중치 신장 트리는 가중치가 부여된 연결 그래프에서 모든 정점(vertex)을 연결하면서 사이클(cycle)을 만들지 않고, 간선 가중치의 총합이 최소가 되도록 선택한 간선들의 부분 집합을 의미합니다.쉽게 말해, 그래프의 모든 노드를 잇되 불필요한 간선은 제거하고, 전체 연결 비용이 가장 작아지도록 만든 트리라고 할 수 있습니다. 여기서 신장(spanning)이라는 말은 그래프의 모든 정점을 포함한다는 뜻이며, 트리라는
프림(Prim) 알고리즘은 가중치가 있는 무방향 그래프에서 최소 신장 트리(Minimum Spanning Tree, MST)를 찾는 대표적인 탐욕(Greedy) 알고리즘입니다. 그래프의 모든 정점을 포함하면서 간선 가중치의 합이 최소가 되는 트리를 구성하는 간선들의 부분 집합을 찾아냅니다.이 알고리즘은 임의의 시작 정점에서 출발하여 한 번에 하나씩 정점을 트리에 추가해 나가는 방식으로 동작합니다. 매 단계마다 현재까지 만들어진 트리에서 다른 정점으로 이어지는 가장 저렴한 연결(간선)을 선택하는 것이 핵심입니다.프림 알고리즘의 동작
크루스칼 알고리즘이란?크루스칼(Kruskal) 알고리즘은 가중치 그래프에서 최소 신장 트리(Minimum Spanning Tree, MST)를 찾는 대표적인 그리디(Greedy) 알고리즘입니다. 네트워크 설계, 도로 포설, 통신 케이블 배치처럼 모든 지점을 연결하면서 비용을 최소화해야 하는 문제에 널리 활용됩니다.알고리즘의 동작 순서는 다음과 같습니다.그래프의 모든 간선(edge)을 하나의 집합으로 만듭니다.집합이 비어 있지 않고, 모든 정점이 아직 커버되지 않은 동안 다음을 반복합니다.집합에서 가중치가 가장 작은 간선을 꺼냅니다.
자바스크립트에서 배열에 새로운 요소를 추가할 때는 추가하고 싶은 위치에 따라 서로 다른 메서드를 사용합니다. 이 글에서는 배열의 끝, 시작, 그리고 특정 위치에 요소를 삽입하는 세 가지 방법을 예제 코드와 함께 자세히 알아보겠습니다.1. 배열 끝에 요소 추가하기 — push()배열의 맨 끝에 요소를 추가하려면 push 메서드를 사용합니다.let veggies = [Onion, Raddish]; veggies.push(Cabbage); console.log(veggies);실행 결과는 다음과 같습니다.[Onion, Raddish, C
자바스크립트에서 배열의 요소를 제거해야 하는 상황은 크게 세 가지로 나눌 수 있습니다. 배열의 끝에서 요소를 제거하는 경우, 배열의 시작에서 요소를 제거하는 경우, 그리고 특정 위치(인덱스)의 요소를 제거하는 경우입니다. 각 상황에 맞는 메서드를 예제와 함께 살펴보겠습니다. 배열 끝에서 요소 제거하기 — pop() 배열의 마지막 요소를 제거하려면 pop() 메서드를 사용합니다. 이 메서드는 제거된 요소를 반환하므로, 필요하다면 변수에 담아 활용할 수도 있습니다. let veggies = ["Onion", "
다차원 배열(multidimensional array)은 기본적으로 배열 안에 또 다른 배열을 넣고 싶을 때 사용합니다. 예를 들어, 평일 동안 6시간 간격으로 측정한 온도를 저장해야 한다고 가정해 보겠습니다. 이 경우 다음과 같이 요일별로 변수를 만들어 저장할 수 있습니다.let monday = [35, 28, 29, 31]; let tuesday = [33, 24, 25, 29]; //...하지만 요일이 많아질수록 변수를 일일이 선언하는 방식은 비효율적입니다. 이럴 때 다차원 배열을 사용하면 데이터를 훨씬 깔끔하게 관리할 수 있
자바스크립트(JavaScript)에서 배열이나 객체를 순회하는 방법은 매우 다양합니다. 상황에 맞는 반복문을 선택하면 코드의 가독성과 효율성을 모두 높일 수 있습니다. 이 글에서는 가장 널리 사용되는 for, for...in, while, do...while 반복문의 특징과 사용법을 예제와 함께 살펴보겠습니다. 자바스크립트의 For 반복문 가장 기본적인 for 문에는 두 가지 변형이 있습니다. 첫 번째는 초기화(init), 조건(condition), 증감식(expr)으로 구성된 전통적인 for 문입니다. 먼저 초기화 문장을 실행한
동적 프로그래밍(Dynamic Programming)이란?동적 프로그래밍(Dynamic Programming, DP)은 복잡한 문제를 더 작고 단순한 하위 문제(sub-problem)로 분할하여 해결하는 알고리즘 설계 기법입니다. 중요한 점은 각 하위 문제를 독립적으로 처리하는 것이 아니라는 것입니다. 한 번 계산된 하위 문제의 결과는 메모리에 저장되며, 이후 유사하거나 중복되는 하위 문제를 만났을 때 다시 계산하지 않고 저장된 결과를 그대로 재활용합니다.이러한 특성 덕분에 동적 프로그래밍은 불필요한 중복 연산을 제거하여 실행 속도
피보나치 수열이란? 피보나치 수열은 첫 두 항을 제외한 모든 항이 바로 앞의 두 항의 합으로 이루어지는 수열입니다. 수열은 1, 1로 시작하며 다음과 같습니다. 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 단순 재귀로 구현하기 n번째 피보나치 수를 구하는 가장 직관적인 방법은 재귀 함수를 사용하는 것입니다. function fibNaive(n) { if (n <= 1) return n; return fibNaive(n - 1) + fibNaive(n - 2); } 다음과 같이 테스트해 볼 수 있
AVL 트리는 이진 탐색 트리(BST)의 단점을 보완한 자가 균형(self-balancing) 트리입니다. 일반적인 이진 탐색 트리는 데이터가 정렬된 순서로 삽입되면 한쪽으로 치우쳐 연결 리스트와 같은 형태가 되고, 검색 성능이 O(N)까지 저하될 수 있습니다. 반면 AVL 트리는 삽입·삭제 시마다 각 노드의 균형 인수(balance factor)를 확인하고, 균형이 깨지면 회전(rotation)을 수행하여 트리의 높이를 항상 O(log N)으로 유지합니다. 다음은 자바스크립트로 작성한 AVL 트리 클래스의 전체 구현 예제입니다.
그래프란 무엇인가?그래프(Graph)는 객체들의 집합에서 일부 객체 쌍이 연결선으로 이어진 관계를 시각적으로 표현한 자료구조입니다. 상호 연결된 객체들은 정점(vertex)이라 부르는 점으로 표현되고, 정점들을 잇는 연결선은 간선(edge)이라고 합니다.형식적으로 그래프는 두 집합의 쌍 (V, E)로 정의됩니다. 여기서 V는 정점의 집합이며, E는 정점 쌍을 연결하는 간선의 집합입니다. 아래 그래프를 살펴보겠습니다.V = {a, b, c, d, e} E = {ab, ac, bd, cd, de}핵심 용어 정리수학적 그래프는 데이터 구
이 글에서는 가중치(weight)를 지원하고 방향 그래프와 무방향 그래프를 모두 다룰 수 있는 그래프 클래스를 만들어 보겠습니다. 구현은 인접 리스트(Adjacency List) 방식을 사용하며, 이후 BFS, 최단 경로 같은 고급 알고리즘을 학습할 때 가중치와 방향성 정보가 유용하게 활용됩니다.인접 리스트란?인접 리스트는 개별 리스트들을 담고 있는 배열 A입니다. 배열의 각 원소 A[i]는 하나의 리스트로, 정점 i에 인접한(연결된) 모든 정점들을 포함합니다. 우리는 이 인접 리스트를 nodes(정점 목록)와 edges(간선 정보
그래프 순회란 무엇인가? 그래프 순회(Graph Traversal), 즉 그래프 탐색은 그래프 자료구조에 포함된 모든 정점(Vertex)을 체계적으로 방문하면서 확인하거나 업데이트하는 과정을 의미합니다. 여기서 방문이란 해당 정점의 데이터를 읽거나, 조건을 검사하거나, 값을 수정하는 등의 작업을 수행하는 것을 뜻합니다. 그래프는 소셜 네트워크의 친구 관계, 지도의 도시와 도로, 웹 페이지 간의 링크 구조처럼 현실 세계의 다양한 연결 관계를 표현하는 데 활용되므로, 그래프 순회는 알고리즘 문제 해결과 실무 개발 모두에서 매우 중요한
너비 우선 탐색(BFS)이란?너비 우선 탐색(BFS, Breadth-First Search)은 자식 정점을 방문하기 전에 먼저 인접한 이웃 정점들을 모두 방문하는 그래프 순회 알고리즘입니다. BFS는 탐색 과정에서 큐(Queue) 자료구조를 활용한다는 점이 특징입니다.BFS의 동작 원리BFS는 다음 세 가지 규칙에 따라 동작합니다.인접한 미방문 정점을 방문하고, 방문 처리한 후 화면에 표시한 뒤 큐에 삽입(enqueue)합니다.더 이상 방문하지 않은 인접 정점이 없다면, 큐의 맨 앞 정점을 제거(dequeue)합니다.큐가 빌 때까지