컴퓨터 과학에서 연관 배열(associative array), 맵(map), 심볼 테이블(symbol table), 딕셔너리(dictionary)는 (키, 값) 쌍의 집합으로 구성된 추상 자료형입니다. 이때 각 키는 컬렉션 안에서 최대 한 번만 나타날 수 있습니다. 참고로 딕셔너리는 흔히 맵이라고도 불립니다.딕셔너리 문제(dictionary problem)는 컴퓨터 과학의 고전적인 주제 중 하나로, 데이터 집합을 검색, 삭제, 삽입 연산 과정에서 효율적으로 관리할 수 있는 자료구조를 설계하는 과제를 의미합니다. 딕셔너리는 다양한 방
이 글에서는 자바스크립트로 사전(Dictionary) 자료구조를 직접 구현하는 방법을 알아봅니다. 내장 Map 클래스와 이름이 충돌하지 않도록 MyMap이라는 별도의 클래스를 만들고, 맵에 추가되는 모든 값을 관리할 컨테이너 객체를 정의하겠습니다. 또한 맵의 현재 상태를 출력해 주는 display 함수도 함께 작성합니다.예제: MyMap 클래스 기본 구조class MyMap { constructor() { this.container = {}; } display() { console.log(this.conta
이번 글에서는 사전(딕셔너리)에 키-값 쌍을 저장할 수 있도록 해주는 put 메서드를 만들어 보겠습니다. 이 메서드를 활용하면 자바스크립트에서 간단한 맵(Map) 구조를 직접 구현할 수 있습니다.put 메서드 구현하기흥미로운 점은 자바스크립트의 객체(Object)가 이미 사전과 매우 유사하게 동작한다는 것입니다. 따라서 컨테이너 객체의 키 속성에 값을 할당하는 방식만으로 put 메서드를 손쉽게 구현할 수 있습니다.예제 코드put(key, value) { this.container[key] = value; }이렇게 구현한 pu
사전(Dictionary)에서 요소를 제거하려면, 먼저 해당 키가 사전에 존재하는지 확인해야 합니다. 이를 위해 hasKey 메서드를 사용하고, 키가 존재하는 경우 delete 연산자로 해당 요소를 바로 삭제할 수 있습니다.또한 메서드가 Boolean 값을 반환하도록 하면, 호출한 곳에서 해당 키가 실제로 존재했는지 여부를 알 수 있어 코드의 신뢰성을 높일 수 있습니다.예제: 커스텀 MyMap 구현delete(key) { if(this.hasKey(key)) { delet
이번 글에서는 사전(Dictionary) 자료구조에서 주어진 키(key)를 검색하는 get 메서드를 직접 구현해 보겠습니다.get 메서드 구현 예제get(key) { if(this.hasKey(key)) { return this.container[key]; } return undefined;}JavaScript 객체는 내부적으로
연결 리스트(Linked List)에서 요소를 제거하는 작업은 생각보다 간단합니다. 핵심은 제거하고 싶은 노드에 대한 참조(reference)를 끊어버리는 것입니다. 참조가 끊긴 노드는 더 이상 리스트에 접근할 수 없게 되어 자연스럽게 제거된 것과 같아집니다.이중 연결 리스트에서 요소를 제거할 때는 다음의 세 가지 경우를 고려해야 합니다.요소 제거의 3가지 경우1. 헤드(Head)에서 제거첫 번째 요소를 제거하는 경우입니다. head = head.next로 헤드 포인터를 다음 노드로 옮기고, 새로운 헤드가 된 노드의 prev 링크를
이중 연결 리스트(Doubly Linked List)는 각 노드가 데이터(data), 이전 노드 참조(prev), 다음 노드 참조(next) 세 가지 요소로 구성되는 선형 자료구조입니다. 단일 연결 리스트와 달리 양방향 탐색이 가능하기 때문에 앞뒤 어느 방향으로든 순회할 수 있으며, 특정 위치에서의 삽입과 삭제가 더 유연하다는 장점이 있습니다.DoublyLinkedList 클래스 전체 구현아래는 head(머리), tail(꼬리), length(길이) 세 가지 속성을 관리하는 자바스크립트 이중 연결 리스트 클래스의 완전한 구현 예제입
순환 연결 리스트란?순환 연결 리스트(Circular Linked List)는 연결 리스트의 한 변형으로, 첫 번째 요소가 마지막 요소를 가리키고 마지막 요소가 다시 첫 번째 요소를 가리키는 자료구조입니다. 일반적인 연결 리스트에서 마지막 노드는 null을 가리켜 리스트의 끝을 표시하지만, 순환 연결 리스트에서는 마지막 노드가 첫 번째 노드와 다시 연결되어 리스트 전체가 하나의 고리처럼 이어집니다.순환 연결 리스트의 종류1. 단일 순환 연결 리스트각 노드가 다음 노드만 가리키며, 마지막 노드가 첫 번째 노드를 가리키는 가장 기본적인
자바스크립트 원형 단일 연결 리스트란?원형 단일 연결 리스트(Circular Singly Linked List)는 일반적인 단일 연결 리스트(Singly Linked List)를 변형한 자료구조입니다. 가장 큰 특징은 마지막 노드의 next 포인터가 null이 아닌 첫 번째 노드를 가리킨다는 점입니다.이러한 구조 덕분에 리스트의 시작과 끝이 하나의 고리처럼 이어져 있어, 어떤 노드에서 출발하더라도 순차적으로 모든 노드를 순회할 수 있습니다.구조 살펴보기아래 그림은 원형 단일 연결 리스트의 기본 구조를 보여줍니다. 각 노드는 데이터와
원형 이중 연결 리스트란?원형 이중 연결 리스트(Circular Doubly Linked List)는 일반적인 이중 연결 리스트를 변형한 자료구조입니다. 일반적인 이중 연결 리스트에서는 마지막 노드의 next 포인터가 null을 가리키지만, 원형 이중 연결 리스트에서는 마지막 노드의 next 포인터가 첫 번째 노드를 가리키고, 반대로 첫 번째 노드의 prev 포인터가 마지막 노드를 가리킵니다. 그 결과 리스트가 양방향으로 순환하는 원형 구조를 갖게 됩니다.이러한 구조 덕분에 어떤 노드에서 출발하더라도 양쪽 방향 모두로 끝없이 순회할
Set이란 무엇인가?Set(집합)은 특정 값들을 저장할 수 있는 추상 자료형(Abstract Data Type)입니다. Set의 가장 큰 특징은 순서가 없고 중복된 값을 허용하지 않는다는 점입니다. 즉, 동일한 값이 여러 번 저장되지 않으며, 각 요소는 집합 안에서 단 한 번만 존재합니다.이러한 Set은 수학에서 다루는 유한 집합(finite set) 개념을 컴퓨터 과학적으로 구현한 것이라 할 수 있습니다.다른 컬렉션과의 차이점배열(Array)이나 리스트(List)와 같은 대부분의 컬렉션 자료형은 특정 위치의 요소를 검색하거나 인덱
자바스크립트에서 Set(집합)은 고유한(unique) 요소만 저장해야 하고, 요소들의 순서가 중요하지 않으며, 주로 특정 값이나 객체가 컬렉션에 포함되어 있는지 확인하는 용도로 사용될 때 가장 적합한 자료구조입니다.또한 수학의 집합 개념처럼 합집합(union), 교집합(intersection), 차집합(difference)과 같은 집합 연산을 수행해야 할 때도 Set이 매우 유용하게 활용됩니다.이번 글에서는 Set을 직접 구현하는 방법과 함께, ES6부터 기본으로 제공되는 내장 Set 클래스를 사용하는 방법을 모두 살펴보겠습니다.구
자바스크립트에는 이미 내장된 Set 클래스가 있지만, 집합 자료구조의 동작 원리를 깊이 이해하려면 직접 구현해 보는 것이 좋습니다. 이 글에서는 내장 Set 클래스와 이름이 겹치지 않도록 MySet 클래스를 만들어 보겠습니다.MySet 클래스 기본 구조먼저, 집합에 추가되는 모든 값을 저장할 컨테이너 객체를 생성합니다. 그리고 현재 집합의 상태를 출력해 주는 display 함수도 함께 정의합니다.예제class MySet { constructor() { this.container = {}; } di
세트(Set)의 add 메서드는 특정 값이 이미 세트에 존재하는지 먼저 확인한 후, 존재하지 않는 경우에만 해당 값을 세트에 추가합니다. 이러한 동작 방식 덕분에 세트의 핵심 특성인 중복 허용 불가를 자연스럽게 유지할 수 있습니다.아래와 같이 직접 구현해 볼 수 있습니다.add 메서드 구현 예제add(val) { if (!this.has(val)) { this.container[val] = val; return true; } return false; }동작 원리this.has(val): 세트에 해
세트(Set) 자료구조에서 특정 값을 제거하려면 delete 메서드를 사용합니다. 이 메서드는 먼저 해당 값이 세트에 존재하는지 확인한 후, 값이 있다면 세트에서 이를 제거하고 true를 반환합니다. 만약 값이 존재하지 않는다면 아무 작업도 수행하지 않고 false를 반환합니다.delete 메서드 구현하기커스텀 세트 클래스에서 delete 메서드는 다음과 같이 구현할 수 있습니다.delete(val) { if (this.has(val)) { &nb
자바스크립트 연결 리스트의 기본 구조위 그림에서 보여지듯이, 자바스크립트에서 연결 리스트(Linked List)를 표현할 때는 다음과 같은 중요한 사항들을 고려해야 합니다.LinkedList 객체는 first라는 이름의 링크 요소를 포함하며, 이 요소는 리스트의 시작 지점을 가리킵니다.각 Link(노드)는 하나 이상의 데이터 필드(data field)와 next라는 이름의 링크 필드를 가집니다.각 링크는 자신이 가진 next 필드를 통해 다음 링크와 연결되며, 이러한 연결이 반복되면서 전체 리스트가 형성됩니다.마지막 링크의 next
연결 리스트의 주요 유형연결 리스트(Linked List)는 각 노드가 데이터와 함께 다른 노드를 가리키는 참조(포인터)를 담고 있는 선형 자료구조입니다. 구현 방식에 따라 크게 세 가지 형태로 나뉘며, 각 유형은 탐색 방향과 구조에서 차이를 보입니다.1. 단일 연결 리스트 (Singly Linked List)각 노드가 다음 노드만을 가리키는 가장 기본적인 형태입니다. 탐색이 오직 앞쪽에서 뒤쪽으로 한 방향으로만 진행되기 때문에, 특정 노드의 이전 노드에 접근하려면 처음부터 다시 순회해야 합니다.2. 이중 연결 리스트 (Doubly
리스트에서 지원하는 기본 연산리스트(List)는 데이터를 순차적으로 저장하는 대표적인 자료구조입니다. 자바스크립트에서 리스트를 다룰 때 활용되는 핵심 기본 연산은 다음과 같습니다.삽입(Insertion) − 리스트의 맨 앞에 새로운 요소를 추가합니다.삭제(Deletion) − 리스트의 맨 앞에 있는 요소를 제거합니다.출력(Display) − 리스트에 저장된 모든 요소를 처음부터 끝까지 화면에 표시합니다.검색(Search) − 주어진 키(key)를 이용해 원하는 요소를 찾아냅니다.키 기반 삭
연결 리스트는 데이터 요소들이 순차적으로 연결된 자료구조로, 각 노드는 데이터와 다음 노드를 가리키는 참조로 구성됩니다. 이번 글에서는 자바스크립트 클래스를 활용해 연결 리스트를 직접 만들어 보겠습니다.LinkedList 클래스 정의하기먼저 생성자에서 head를 null로 초기화하는 간단한 클래스부터 정의하겠습니다. 또한 LinkedList 클래스의 프로토타입에 연결 리스트의 각 노드를 나타내는 별도의 구조체(Node)도 함께 정의합니다.class LinkedList { constructo
연결 리스트(Linked List)는 각 노드가 데이터와 다음 노드에 대한 참조(포인터)를 함께 가지는 선형 자료구조입니다. 이번 글에서는 자바스크립트로 구현한 연결 리스트의 특정 위치에 새로운 요소를 삽입하는 insert(data, position) 함수를 만들어 보겠습니다. 삽입 동작의 단계별 흐름 새 노드 생성: 삽입할 데이터를 담은 새로운 Node 객체를 만듭니다. 빈 리스트 확인: 리스트가 비어 있다면(head === null) 새 노드를 head로 지정하고 바로 반환합니다. 위치까지 순회: 리스트가 비어 있지 않다면