코딩테스트 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서

··설명 약 29분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

본문부터 시작해도 좋습니다. 낯선 개념이 나오면 설명과 작은 예제를 함께 읽어 보세요.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 준비와 기초 구현 · 길잡이

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

코딩테스트에서 배열·해시·스택·투 포인터는 어떤 순서로 공부하면 되나요?

익숙한 언어로 기초 구현을 익힌 뒤 문자열·자료구조·탐색·구간 처리로 넓혀 가세요. 각 단계에서 개념을 읽고 연결된 문제를 풀 수 있으며, 전체 문제와 읽음 기록은 알고리즘 학습 목록에서 확인합니다.

적용 조건·범위: 공개 문제는 JavaScript·Python·Java·C++·C# 중 익숙한 언어로 직접 풀고 해답을 비교할 수 있습니다. 이 길잡이의 로컬 실행 예제는 JavaScript와 Node.js를 기준으로 합니다.

본문 근거: ECMAScript 2026 keyed collections 명세 · Node.js CommonJS 문서 · MDN의 Array.prototype.reduce 문서

개념을 익히고 문제로 연습하기

첨부한 55개 코드로 공부하기

현재 통합 학습 경로는 110편입니다. 자료구조 개념 23편, 알고리즘 개념 30편, 문제풀이 56편과 길잡이 1편으로 구성했습니다. 기초 구현·문자열·재귀·정렬·탐색·그래프·동적 계획법(DP)을 함께 공부하고, 균형 트리·최대 유량·외판원은 필요한 주제부터 선택해 읽습니다. 아래 목록에서 개념과 관련 문제를 고르고, 첨부 코드는 파일별 찾아보기로 연결해 보세요. 이 경로의 완주가 코딩테스트 전체 준비의 완료를 뜻하지는 않습니다.

배운 개념을 바로 문제에 적용하는 통합 경로입니다. 단계 확인을 마친 뒤 다음 주제로 넘어가고, 심화는 필요한 구조부터 선택하세요.

자료구조·코딩테스트 함께 공부하기

개념을 읽고 대응 문제를 풀며 기초부터 이어갑니다. 아래 기존 과정 목록과 읽음 기록도 그대로 사용할 수 있습니다.

공개 111편 · 자료구조 23편 · 문제 57편 · 알고리즘 개념 30편 · 길잡이 1편

첫 개념부터 시작

전체 추천 경로와 단계 목표 보기 (13단계)
  1. 준비와 기초 구현 14편

    입력·반환값을 구분하고 조건을 통과한 값으로 합·개수·최솟값을 갱신합니다.

    1. 길잡이 코딩테스트 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
    2. 알고리즘 개념 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신
    3. 자료구조 개념 JavaScript 배열: 인덱스 조회와 삽입·삭제 비용
    4. 문제 세 수 중 최솟값 조건문 풀이 정리
    5. 문제 삼각형 판별하기 풀이
    6. 문제 연필 개수 풀이
    7. 문제 1부터 N까지 합 출력하기 풀이
    8. 문제 최솟값 구하기 풀이|배열 순회와 비교 갱신 원리
    9. 문제 홀수 풀이: 조건 판별과 결과 처리 정리
    10. 문제 10부제 풀이: 끝자리 비교로 위반 차량 수 세기
    11. 문제 큰 수 출력하기 풀이
    12. 문제 보이는 학생 풀이
    13. 문제 가위바위보 풀이
    14. 문제 점수계산 풀이

    단계 확인: 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.

  2. 문자열 기초 10편

    문자 순회·판별·변환·인덱스와 최초 등장 위치를 익힙니다.

    1. 알고리즘 개념 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출
    2. 문제 A를 #으로 풀이: 문자열 순회와 치환
    3. 문제 문자 찾기 풀이: 문자열 순회로 개수 세기
    4. 문제 대문자 찾기 풀이
    5. 문제 대문자로 통일 풀이
    6. 문제 대소문자 변환 풀이
    7. 문제 가장 긴 문자열 풀이
    8. 문제 가운데 문자 출력 풀이
    9. 문제 중복문자제거 풀이
    10. 문제 중복단어제거 풀이

    단계 확인: 같은 문자·찾는 문자 없음·홀짝 길이를 확인하고 결과의 등장 순서를 설명하세요.

  3. 문자열 응용 7편

    전처리·회문·양방향 스캔·연속 문자 묶기를 기본 순회에 연결합니다.

    1. 알고리즘 개념 투 포인터의 이동 기준: 양끝 비교와 정렬 배열 병합
    2. 문제 회문 문자열 풀이: 양끝 비교로 대소문자 없이 판별하기
    3. 문제 유효한 팰린드롬 풀이: 알파벳만 남겨 회문을 판별하는 방법
    4. 문제 숫자만 추출 풀이: 문자 사이의 숫자를 순서대로 수로 만들기
    5. 알고리즘 개념 양방향 스캔: 왼쪽·오른쪽 상태로 가장 가까운 문자 찾기
    6. 문제 가장 짧은 문자거리 풀이: 양방향 탐색으로 최소거리 구하기
    7. 문제 문자열 압축 풀이: 연속한 문자만 횟수로 묶는 방법

    단계 확인: 전처리할 문자와 비교할 문자를 구분하고 마지막 문자·마지막 묶음을 확인하세요.

  4. 완전탐색과 격자 7편

    서로 다른 후보를 빠짐없이 고르고 행·열·이웃의 경계를 구분합니다.

    1. 문제 자릿수의 합: 동률이면 더 큰 수 고르기
    2. 알고리즘 개념 완전탐색과 쌍 비교: 중복 없는 후보 열거와 순위 계산
    3. 문제 일곱 난쟁이 풀이: 두 명을 제외하는 완전탐색
    4. 문제 등수구하기 풀이
    5. 알고리즘 개념 2차원 배열 탐색: 행·열·대각선과 상하좌우 경계
    6. 문제 격자판 최대합 풀이: 행·열·대각선 합을 어떻게 비교할까요?
    7. 문제 봉우리 풀이: 상하좌우 비교로 개수를 어떻게 셀까요?

    단계 확인: 같은 쌍을 두 번 세지 않는 이유와 모서리·대각선의 좌표를 설명하세요.

  5. 재귀와 호출·복귀 3편

    기저 조건과 작아지는 입력을 정하고 호출과 반환 순서를 추적합니다.

    1. 알고리즘 개념 재귀의 종료 조건: 작은 문제와 기저 조건으로 거듭제곱 계산하기
    2. 알고리즘 개념 재귀적으로 생각하기: 배열 합의 호출과 복귀를 따라가기
    3. 알고리즘 개념 하노이의 탑: 큰 원판 하나를 옮기기 위한 재귀적 순서

    단계 확인: 기저 조건에 도달하는 이유와 호출 뒤 돌아와 처리하는 작업을 작은 입력으로 설명하세요.

  6. 자료구조 개념과 문제 17편

    저장할 상태와 필요한 연산에 따라 구조를 고른 뒤 바로 문제에 적용합니다.

    1. 자료구조 개념 자료구조 선택 가이드: 연산 비용으로 배열·스택·큐·Set 고르기
    2. 자료구조 개념 JavaScript Map·Set: 값 조회와 중복 제거 실습
    3. 문제 코딩테스트 Map 풀이: 학급 회장 득표수 세기
    4. 자료구조 개념 JavaScript 문자열 해시 테이블 구현: 충돌 처리와 리사이즈, NFC 정규화
    5. 문제 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
    6. 자료구조 개념 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기
    7. 문제 코딩테스트 스택 풀이: 올바른 괄호 검증하기
    8. 문제 코딩테스트 스택 풀이: 괄호문자 제거하기
    9. 문제 코딩테스트 스택 풀이: 크레인 인형뽑기 처리법
    10. 문제 코딩테스트 스택 풀이: 후위식 연산 계산하기
    11. 문제 코딩테스트 스택 풀이: 쇠막대기 레이저 절단 개수 세기
    12. 자료구조 개념 큐와 FIFO: head 인덱스로 JavaScript 대기열 만들기
    13. 문제 코딩테스트 큐: 상담 창구 대기열 명령 처리
    14. 자료구조 개념 단방향 연결 리스트: head·tail 삽입과 삭제
    15. 문제 코딩테스트 연결 리스트: 재생 대기 목록 관리
    16. 자료구조 개념 JavaScript 원형 덱 구현: 양끝 삽입·삭제와 고정 용량 버퍼
    17. 문제 원형 덱 연습: 최근 기록 창과 되돌리기

    단계 확인: 삽입·제거 전후의 상태를 그리고, 내장 도구를 쓰는 풀이와 직접 구현의 목적을 구분하세요.

  7. 정렬의 원리와 불변식 5편

    비교·교환·이동과 분할·병합을 구분하고 정렬된 구간이 늘어나는 과정을 확인합니다.

    1. 알고리즘 개념 버블 정렬: 이웃 비교로 가장 큰 값을 뒤에 확정하기
    2. 알고리즘 개념 선택 정렬: 남은 구간의 최솟값으로 앞자리를 확정하기
    3. 알고리즘 개념 삽입 정렬: 정렬된 앞부분에 다음 값을 끼워 넣기
    4. 알고리즘 개념 병합 정렬: 작은 정렬 결과를 두 포인터로 합치기
    5. 알고리즘 개념 퀵 정렬: 첫 피벗의 자리를 확정하고 양쪽을 정렬하기

    단계 확인: 중복 값과 이미 정렬된 입력을 확인하고 추가 공간과 최악 시간의 조건을 설명하세요.

  8. 구간과 탐색 8편

    정렬 조건·창의 상태·탐색 구간을 근거로 반복 계산을 줄입니다.

    1. 문제 코딩테스트 투 포인터 풀이: 두 정렬 배열 합치기
    2. 문제 코딩테스트 투 포인터 풀이: 공통 원소 추출하기
    3. 알고리즘 개념 슬라이딩 윈도우: 고정 길이 합과 양수 배열의 가변 구간
    4. 문제 코딩테스트 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
    5. 문제 투 포인터: 합이 M인 연속 부분수열 개수
    6. 문제 코딩테스트 해시 풀이: 모든 아나그램 찾기
    7. 알고리즘 개념 이진 탐색의 불변식: 탐색 구간·중간값·종료 조건
    8. 문제 이진 탐색 연습: 숫자 카드 존재 여부 확인

    단계 확인: 포인터를 움직여도 답을 버리지 않는 이유와 양수·0·음수의 차이를 설명하세요.

  9. 동적 계획법의 두 계산 순서 2편

    중복 부분 문제의 결과를 저장하고 메모이제이션과 타뷸레이션의 계산 순서를 비교합니다.

    1. 알고리즘 개념 DP 메모이제이션: 피보나치의 중복 호출 줄이기
    2. 알고리즘 개념 DP 타뷸레이션: 작은 답부터 테이블 채우기

    단계 확인: 같은 부분 문제를 다시 계산하는 지점과 저장한 값을 재사용하는 지점을 구분하세요.

  10. 트리·그래프와 최단거리 14편

    큐·트리·힙·그래프의 표현을 익히고 방문과 거리 완화를 구분합니다.

    1. 자료구조 개념 트리 자료구조 차이: 이진 트리 BST MST 구분하기
    2. 문제 트리 순회 연습: 깊이별 노드 묶기
    3. 자료구조 개념 JavaScript 이진 탐색 트리 구현: 중복 키와 세 가지 삭제 처리
    4. 문제 BST 연습: 닫힌 구간의 중복 키 보고서
    5. 자료구조 개념 JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
    6. 알고리즘 개념 제자리 힙 정렬: 배열 heapify와 확정 구간의 경계
    7. 문제 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
    8. 자료구조 개념 JavaScript 그래프 구현: 인접 리스트·인접 행렬 비교와 BFS
    9. 알고리즘 개념 그래프 DFS: 방문 표시로 순환을 멈추고 연결을 따라가기
    10. 알고리즘 개념 DFS와 BFS 비교: 깊이·대기열·최소 간선 수를 구분하기
    11. 문제 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
    12. 알고리즘 개념 다익스트라의 원리: 거리 완화와 오래된 후보 건너뛰기
    13. 문제 코딩테스트 고급: 최소 힙으로 다익스트라 최단 경로 구하기
    14. 알고리즘 개념 프림 알고리즘: 최소 신장 트리와 연결되지 않은 그래프 처리

    단계 확인: 층별 방문 순서와 최솟값 추출을 추적하고, 다익스트라의 비음수 조건과 오래된 후보를 설명하세요.

  11. 그리디 선택과 반례 2편

    당장의 선택을 반복하는 규칙을 세우고 최적해를 보장하는 조건과 반례를 비교합니다.

    1. 알고리즘 개념 탐욕 알고리즘: 큰 동전 선택과 반례로 확인하는 최적성
    2. 알고리즘 개념 인터벌 스케줄링: 가장 먼저 끝나는 일정을 고르는 이유

    단계 확인: 동전 선택이 실패하는 입력과 종료 시각 기준 인터벌 선택의 교환 근거를 설명하세요.

  12. 심화 선택 실습 17편

    연결 관리·접두사·갱신 구간·최근 사용·균형 검색 중 필요한 주제를 선택합니다.

    1. 자료구조 개념 JavaScript Union-Find: 경로 압축과 크기 합치기로 연결 상태 관리하기
    2. 문제 코딩테스트 Union-Find: 연결 성분 수와 크기 구하기
    3. 자료구조 개념 JavaScript Trie: Unicode 접두사 검색과 안전한 삭제 구현
    4. 자료구조 개념 Trie 자동완성: 접두사 아래 단어를 정해진 순서로 모으기
    5. 문제 코딩테스트 Trie: 접두사에 맞는 단어 수 세기
    6. 자료구조 개념 JavaScript Fenwick Tree: lowbit로 구간 합과 단일 증가 갱신 구현
    7. 문제 코딩테스트 Fenwick Tree: 값 갱신과 구간 합 처리
    8. 자료구조 개념 JavaScript 반복형 세그먼트 트리: 구간 합·단일 대입·결합 순서
    9. 문제 코딩테스트 세그먼트 트리: 단일 대입과 구간 합
    10. 자료구조 개념 JavaScript LRU 캐시: Map과 이중 연결 리스트의 불변식
    11. 문제 코딩테스트 LRU 캐시: 지도 타일 재사용 기록
    12. 자료구조 개념 JavaScript AVL 트리: 높이 불변식과 LL·RR·LR·RL 삽입 회전
    13. 자료구조 개념 AVL 트리 삭제: 높이 갱신과 연속 균형 복구
    14. 문제 코딩테스트 AVL 트리: 기준 이상 최솟값 찾기
    15. 자료구조 개념 Red-Black 트리 원리: 색과 검은 높이로 균형 읽기
    16. 자료구조 개념 Red-Black 트리 삽입: LLRB 회전과 색 변환
    17. 자료구조 개념 Red-Black 트리 삭제: LLRB 색 이동과 검은 높이 복구

    단계 확인: 표본 하나에 더해 경계 입력과 작은 기준 풀이를 비교하고 왜 이 구조를 고르는지 설명하세요.

  13. 유량·상태 압축과 계산 복잡도 (선택) 5편

    잔여 경로와 선택 집합을 표현하고 완전탐색·동적 계획법·검증의 비용을 비교합니다.

    1. 알고리즘 개념 포드 풀커슨 최대 유량: 잔여 용량과 역방향 간선으로 선택 수정하기
    2. 알고리즘 개념 비트마스킹 입문: 선택한 항목을 숫자에 기록하기
    3. 알고리즘 개념 외판원 문제: 모든 방문 순서를 비교하고 출발점으로 돌아오기
    4. 알고리즘 개념 외판원 DP: 현재 도시와 방문 집합을 함께 저장하기
    5. 알고리즘 개념 P와 NP: 답을 찾는 일과 확인하는 일의 차이

    단계 확인: 작은 기준 풀이와 비교하고 경로 복원·역방향 취소·입력 크기에 따른 비용을 설명하세요.

현재 공개 범위는 기초 구현·문자열·자료구조·정렬·재귀·구간 탐색·그래프·그리디와 동적 계획법입니다. 균형 트리·최대 유량·상태 압축·외판원과 계산 복잡도는 필요한 주제부터 선택해서 읽습니다.

심화 선택 실습은 필요한 주제부터 고르세요. 이 경로의 완주는 현재 공개 범위의 학습이며 전체 코딩테스트 준비의 완료를 뜻하지 않습니다.

코딩테스트 원래 과정 목록 · 자료구조 원래 과정 목록

이 글에서 정리하는 내용

JS 코딩테스트는 배열 조작부터 익숙해져야 합니다

첫 단계는 입력을 숫자 배열로 바꾸고 인덱스, 현재 값, 누적 상태를 추적하는 연습입니다. map, filter, reduce를 모두 외우기 전에 반복문 한 번이 끝날 때 어떤 값이 변하는지 종이에 적어 보세요. 배열 메서드의 역할과 누적 패턴은 404였던 예전 경로 대신 현재 공개된 JavaScript reduce 학습 글에서 이어서 볼 수 있습니다.

const input = '10 20 30 40';
const values = input.trim().split(/\s+/).map(Number);
const total = values.reduce((sum, value) => sum + value, 0);

console.log(values); // [10, 20, 30, 40]
console.log(total);  // 100

MDN의 Array.prototype.reduce 문서와 ECMAScript 2026 reduce 명세는 callback과 선택적인 initialValue를 정의합니다. 빈 배열에서 initialValue 없이 reduce를 호출하면 TypeError가 발생하므로 코딩테스트에서는 합계의 0, 빈도 객체의 새 Map처럼 자료형에 맞는 초기값을 명시하는 편이 안전합니다.

배열 메서드가 항상 더 좋은 것은 아닙니다. 포인터가 여러 개이거나 중간에 종료해야 하거나 상태 변화가 복잡하면 for 또는 while이 불변식을 드러내기 쉽습니다. 반대로 모든 원소를 같은 규칙으로 변환·선별·누적할 때는 배열 메서드가 의도를 짧게 표현할 수 있습니다.

해시는 값을 세거나 빠르게 찾을 때 등장합니다

값의 등장 횟수, 이미 본 값, 키와 연결된 정보를 반복해서 확인한다면 Map을 후보로 봅니다. ECMAScript의 Map은 키와 값에 임의의 언어 값을 사용할 수 있고, 같은 키는 한 항목만 유지합니다. ECMAScript 2026 keyed collections 명세는 평균 접근 시간이 원소 수에 대해 선형보다 빨라야 한다고 요구하지만 내부 구현을 해시 테이블이나 엄격한 O(1)로 고정하지는 않습니다.

function countValues(values) {
  const counts = new Map();

  for (const value of values) {
    counts.set(value, (counts.get(value) ?? 0) + 1);
  }

  return counts;
}

console.log(countValues(['a', 'b', 'a']).get('a')); // 2

MDN Map 문서도 이 성능 요구와 키 비교 규칙을 설명합니다. 키가 문자열로 한정된 단순 빈도표는 객체로도 풀 수 있지만, 키의 자료형을 보존하거나 삽입 순회와 size가 필요하면 Map이 명확합니다. 반대로 값의 범위가 작고 고정된 정수라면 길이가 정해진 배열 카운터가 더 단순할 수 있습니다.

빈도표와 구간 이동이 함께 나오는 문제는 모든 아나그램 JS 풀이로 확장해 보세요. Map을 선택했다는 사실보다 반복문이 진행되는 동안 “현재 구간의 빈도가 정확하다”는 불변식을 유지하는 것이 핵심입니다.

JS 자료구조 순서: 배열, 해시, 스택

스택은 순서가 되돌아가는 문제에서 의심합니다

스택은 마지막에 넣은 값을 먼저 꺼내는 LIFO 구조입니다. 괄호 짝, 최근 작업 취소, 중첩 구조, 이전의 더 큰 값처럼 현재 원소가 가장 최근의 미해결 원소와 연결될 때 의심합니다. JavaScript에서는 배열의 push와 pop으로 기본 스택을 구현할 수 있습니다.

function isValidParentheses(input) {
  const stack = [];

  for (const char of input) {
    if (char === '(') stack.push(char);
    if (char === ')') {
      if (stack.length === 0) return false;
      stack.pop();
    }
  }

  return stack.length === 0;
}

console.log(isValidParentheses('(())')); // true
console.log(isValidParentheses('(()'));  // false

이 코드의 불변식은 지금까지 읽은 접두사에서 닫히지 않은 여는 괄호만 stack에 남는다는 것입니다. 닫는 괄호를 만났을 때 stack이 비어 있으면 즉시 실패하고, 순회가 끝났을 때도 비어 있어야 합니다. 자세한 개념은 자료구조 스택 push·pop을, 적용 문제는 올바른 괄호 JS 풀이를 이어서 보세요.

투 포인터는 범위를 줄이는 사고방식입니다

투 포인터는 두 위치가 한 방향 또는 양쪽에서 움직이며 이미 확인한 후보를 다시 보지 않는 패턴입니다. 정렬된 두 배열 병합, 정렬된 배열의 합 찾기, 중복 제거가 입문 예시입니다. 포인터를 움직였을 때 버리는 후보가 다시 정답이 될 수 없다는 단조성 또는 정렬 근거가 있어야 합니다.

function mergeSorted(left, right) {
  const result = [];
  let i = 0;
  let j = 0;

  while (i < left.length && j < right.length) {
    if (left[i] <= right[j]) result.push(left[i++]);
    else result.push(right[j++]);
  }

  return result.concat(left.slice(i), right.slice(j));
}

console.log(mergeSorted([1, 3, 5], [2, 4])); // [1, 2, 3, 4, 5]

입력이 정렬되지 않았거나 포인터 이동이 어떤 후보를 안전하게 버리는지 설명할 수 없다면 투 포인터를 바로 적용하면 안 됩니다. 정렬 비용을 포함해도 이득인지 확인하고, 원래 인덱스가 필요한 문제라면 정렬 전에 인덱스를 함께 저장합니다. 이동이 눈에 보이는 연습은 두 배열 합치기 JS 풀이가 좋습니다.

슬라이딩 윈도우는 구간을 다시 계산하지 않는 방식입니다

슬라이딩 윈도우는 연속 구간의 상태를 유지하면서 오른쪽 값을 추가하고 왼쪽 값을 제거합니다. 고정 길이 k의 최대 합은 첫 구간을 한 번 계산한 뒤 창이 이동할 때 들어온 값과 나간 값만 반영하면 됩니다.

function maxFixedWindow(values, k) {
  if (k <= 0 || k > values.length) return null;

  let sum = values.slice(0, k).reduce((acc, value) => acc + value, 0);
  let best = sum;

  for (let right = k; right < values.length; right += 1) {
    sum += values[right] - values[right - k];
    best = Math.max(best, sum);
  }

  return best;
}

console.log(maxFixedWindow([2, 1, 5, 1, 3, 2], 3)); // 9

가변 길이 창에서 합이 기준을 넘으면 왼쪽을 줄이는 전형은 값이 모두 양수처럼 창 변화가 단조로울 때 성립합니다. 음수가 섞이면 왼쪽을 줄였을 때 합이 반드시 작아지지 않으므로 같은 규칙이 정답을 놓칠 수 있습니다. 이 경우 누적합, Map, 다른 탐색을 검토해야 합니다. “연속 구간”이라는 말만 보고 윈도우를 선택하지 말고 상태를 O(1)에 갱신할 수 있는지와 이동 근거를 확인하세요.

문제 유형은 쉬운 입력 추적부터 쌓아가는 것이 좋습니다

단계 연습 문제의 모양 통과 기준
1. 배열 순회 합계, 최댓값, 변환, 필터 한 반복 뒤 변하는 상태를 설명함
2. Map·Set 빈도, 중복, 존재 여부 키와 저장 값, 갱신 시점을 설명함
3. 스택 괄호, 중첩, 최근 미해결 값 stack에 남은 값의 의미를 설명함
4. 투 포인터 정렬 병합, 양끝 범위 축소 버린 후보가 돌아오지 않는 근거를 설명함
5. 윈도우 고정·가변 연속 구간 추가·제거 후 유지되는 상태를 설명함

각 단계에서 필요한 개념과 문제를 선택해 예제 출력·경계 사례·반복 중 유지되는 상태를 확인하세요. 정해진 세 문제를 반드시 풀어야 다음 단계로 갈 수 있는 것은 아닙니다. 설명이 막히면 연결된 개념을 복습하고, 익숙한 내용은 다음 문제에 적용하며 확인할 수 있습니다. 더 넓은 준비 계획은 프론트엔드 코딩테스트 5단계 준비 전략과 함께 살펴보세요.

JS 자료구조 순서 해결: 투 포인터, 슬라이딩 윈도우, 문제 적용

반드시 기록할 검증 항목

  • 빈 배열, 원소 하나, 중복만 있는 입력, 정렬 여부 등 경계값을 적습니다.
  • 반복문 시작과 끝에 참이어야 하는 불변식을 한 문장으로 씁니다.
  • 시간 복잡도에 정렬·slice·concat·중첩 메서드 비용까지 포함합니다.
  • Map을 무조건 O(1)이라고 단정하지 않고 명세가 보장하는 범위와 문제 제한을 구분합니다.
  • 브루트포스와 작은 무작위 입력을 비교해 최적화 풀이의 결과를 검산합니다.

마지막에는 독자가 바로 적용할 기준을 남깁니다

문제에서 보이는 신호 첫 후보 적용 전 반례 질문
모든 원소를 한 번 처리 배열 순회·reduce 중간 종료나 복잡한 상태가 더 중요한가?
빈도·중복·존재 확인 반복 Map·Set 키 범위가 작아 배열이 더 단순한가?
최근 값부터 되돌아감 스택 FIFO 순서라면 큐가 맞지 않는가?
정렬된 범위를 줄일 수 있음 투 포인터 포인터 이동이 후보를 안전하게 버리는가?
연속 구간 상태 재사용 슬라이딩 윈도우 음수·비단조 조건 때문에 이동 규칙이 깨지는가?

도구를 고른 뒤에는 “왜 이 자료구조가 필요한가”, “반복문이 진행돼도 무엇이 항상 맞는가”, “어떤 입력에서 규칙이 깨지는가”를 답하세요. 세 질문에 답하지 못하면 이름을 외운 것이지 풀이를 설계한 것은 아닙니다.

읽는 순서를 정하면 글도 덜 흩어집니다

결론: 배열은 모든 풀이의 입력과 순회의 바닥이고, Map·스택은 필요한 상태의 모양을 바꾸며, 투 포인터·슬라이딩 윈도우는 반복해서 보던 후보나 구간 계산을 줄입니다. 배열 → Map·Set → 스택 → 투 포인터 → 슬라이딩 윈도우 순서로 학습하되, 각 단계의 불변식·예외·검증을 확인하고 필요한 개념으로 돌아오세요. 이 순서는 현재 기초·자료구조 범위의 권장 경로입니다.

오늘은 새 알고리즘을 더 외우기보다 이미 푼 문제 하나를 골라 입력 크기, 저장 상태, 불변식, 경계값, 시간 복잡도를 다섯 줄로 다시 적어 보세요. 그 기록이 다음 문제에서 자료구조를 선택하는 실제 기준이 됩니다.

공식 근거

실행 보충 실습: 함수·표준 입력·복잡도를 직접 확인하기

자료구조를 고르기 전에 코드가 어디에서 입력을 받고 어디로 답을 내보내는지 고정해야 합니다. 브라우저에서 버튼을 눌러 실행하던 JavaScript와 Node.js 채점 코드는 같은 문법을 쓰지만 입출력 도구가 다릅니다. 이 보충 실습은 위에서 사용한 합계 계산을 실행 파일로 완성합니다. 새로운 출제 문제를 추가한 것이 아니라 입력 경로를 비교하기 위한 연습입니다.

1. 실행 환경과 제출 계약을 먼저 확인합니다

환경·계약 입력 답을 전달하는 방법
브라우저 화면 입력 요소, 이벤트 등 화면 갱신 등
함수 호출형 채점 채점기가 함수 인수로 전달 지정 함수에서 return
표준 입력형 채점 Node.js 표준 입력 문자열 정해진 형식으로 표준 출력

플랫폼 이름만으로 제출 방식을 추측하지 말고 문제의 JavaScript 실행 버전, 함수 이름·인수·반환 타입 또는 표준 입력 형식을 확인하세요. 함수 호출형에서는 console.log만 하고 return을 빼면 채점기가 답을 받지 못할 수 있습니다. 표준 입력형에서는 디버그 문장이 표준 출력에 섞이면 오답이 됩니다.

터미널에서 node --version을 실행해 설치 여부와 버전을 확인합니다. 아래 파일은 CommonJS를 명시하는 .cjs 확장자를 사용하므로 주변 package.json의 type 설정과 혼동을 줄입니다. 브라우저에서는 Node의 require와 파일 API를 그대로 사용할 수 없습니다. Node.js CommonJS 문서를 기준으로 구성했습니다. 이번 검토에서는 Node.js v24.18.0에서 아래 함수·입출력·복잡도 실습을 다시 실행했습니다.

2. 계산 함수를 입출력에서 분리합니다

solution은 숫자 배열을 받아 합계 숫자를 반환합니다. 빈 배열의 합은 0으로 정합니다. solution.cjs를 저장하세요. 마지막 module.exports는 다음 파일과 로컬 테스트에서 함수를 불러오기 위한 연결입니다. 함수 호출형 채점에 제출할 때는 채점기가 요구하는 solution 함수 선언을 사용하고, 로컬 연결용 export 줄과 테스트 실행 부분은 제출 형식에 맞게 제외합니다.

파일: solution.cjs

function solution(values) {
  let total = 0;
  for (const value of values) total += value;
  return total;
}
module.exports = { solution };

이 함수 자체에는 파일 읽기나 출력이 없습니다. 입력 형식이 달라져도 같은 숫자 배열로 바꾸면 계산 부분을 그대로 검증할 수 있습니다. sum 대신 total 하나만 유지하며 이미 읽은 값의 합이 total이라는 불변식을 사용합니다.

3. 표준 입력을 읽고 숫자로 바꿉니다

이 연습의 입력 계약은 첫 토큰 N 뒤에 정수 N개입니다. N은 0 이상 100000 이하, 각 값의 절댓값은 1000000 이하로 제한합니다. 따라서 합의 절댓값도 최대 100000000000이고 Number의 안전한 정수 범위 안입니다. 제한을 없애면 Number 정밀도와 BigInt 필요 여부를 다시 판단해야 합니다.

파일: main.cjs

const fs = require('node:fs');
const { solution } = require('./solution.cjs');

function solve(input) {
  const trimmed = input.trim();
  if (trimmed === '') throw new Error('입력이 비었습니다.');
  const tokens = trimmed.split(/\s+/);
  if (!tokens.every((token) => /^-?\d+$/.test(token))) {
    throw new Error('정수 토큰만 허용합니다.');
  }
  const [n, ...values] = tokens.map(Number);
  if (!Number.isSafeInteger(n) || n < 0 || n > 100000 || values.length !== n) {
    throw new Error('개수 N과 값의 개수를 확인하세요.');
  }
  if (!values.every((value) => Number.isSafeInteger(value) && Math.abs(value) <= 1000000)) {
    throw new Error('각 값은 절댓값 1000000 이하의 정수여야 합니다.');
  }
  return String(solution(values));
}

if (require.main === module) {
  try {
    process.stdout.write(solve(fs.readFileSync(0, 'utf8')) + '\n');
  } catch (error) {
    console.error(error.message);
    process.exitCode = 1;
  }
}
module.exports = { solve };

readFileSync(0, “utf8”)의 0은 표준 입력 파일 디스크립터이고 utf8은 문자열로 읽겠다는 설정입니다. Node.js stdin 문서와 파일 읽기 문서에서 확인할 수 있습니다. require.main === module 조건 때문에 직접 실행할 때만 입력을 읽고, 테스트에서 불러올 때는 입력을 기다리지 않습니다.

빈 문자열에 곧바로 split과 Number를 적용하면 빈 입력을 0으로 오해할 수 있어 먼저 검사했습니다. /\s+/는 연속 공백·탭·줄바꿈을 함께 나누고 Number가 숫자로 변환합니다. 그러나 문장, 격자 행, 앞뒤 공백이 의미 있는 문제에는 전체 trim과 공백 분리가 맞지 않을 수 있습니다. 그런 문제는 줄 단위 구조를 유지하는 별도 파서가 필요합니다.

input.txt를 같은 폴더에 저장합니다. 아래 명령은 macOS·Linux·Git Bash·Windows 명령 프롬프트처럼 입력 리다이렉션을 지원하는 셸에서 실행합니다. PowerShell에서는 같은 폴더에서 cmd /c "node main.cjs < input.txt"로 실행할 수 있습니다. 온라인 채점기가 한 파일만 받는다면 solution 함수와 main.cjs의 입출력 부분을 한 제출 파일로 합치고 로컬 require/export 연결은 제거해야 합니다.

파일: input.txt

4
10 20 30 40
node main.cjs < input.txt

정상 결과는 숫자 100과 줄바꿈 하나입니다. 이 명령은 입력 파일을 표준 입력으로 보내므로 키보드 입력 종료를 기다리지 않습니다.

100

4. 예제뿐 아니라 경계값과 실제 프로세스를 확인합니다

test.cjs는 계산 함수, 입력 파서, 실제 Node 프로세스의 표준 출력과 종료 코드를 각각 검사합니다. 프로세스 실행에 셸 명령 문자열을 사용하지 않으므로 경로의 공백이나 셸별 리다이렉션 차이 없이 동일한 입력을 보낼 수 있습니다. 아래 검증문은 본문 파일을 직접 불러옵니다.

파일: test.cjs

const assert = require('node:assert/strict');
const { spawnSync } = require('node:child_process');
const path = require('node:path');
const { solution } = require('./solution.cjs');
const { solve } = require('./main.cjs');
assert.equal(solution([]), 0);
assert.equal(solution([10, 20, 30, 40]), 100);
assert.equal(solve('4\r\n10  20\t30 40\r\n'), '100');
assert.equal(solve('0\n'), '0');
assert.equal(solve('3\n-3 0 2'), '-1');
assert.throws(() => solve(''), /비었습니다/);
assert.throws(() => solve('2\n1'), /개수/);
assert.throws(() => solve('1\n3px'), /정수 토큰/);
assert.throws(() => solve('1\n1000001'), /절댓값/);
assert.equal(solve('100000\n' + Array(100000).fill('1000000').join(' ')), '100000000000');
const run = spawnSync(process.execPath, [path.join(__dirname, 'main.cjs')], {
  input: '4\n10 20 30 40\n', encoding: 'utf8',
});
assert.equal(run.status, 0);
assert.equal(run.stdout, '100\n');
assert.equal(run.stderr, '');
const invalid = spawnSync(process.execPath, [path.join(__dirname, 'main.cjs')], {
  input: '2\n1\n', encoding: 'utf8',
});
assert.equal(invalid.status, 1);
assert.equal(invalid.stdout, '');
assert.match(invalid.stderr, /개수/);
console.log('함수, 공백, 경계값, 표준 입출력 검증 통과');
node test.cjs

“함수, 공백, 경계값, 표준 입출력 검증 통과”가 나오면 CRLF 줄바꿈, 빈 배열, 음수, 개수 불일치, 숫자가 아닌 토큰, 값 범위, 최대 N과 실제 stdout까지 통과한 것입니다. 잘못된 입력은 표준 출력에 답을 쓰지 않고 오류 메시지와 종료 코드 1을 내는 것으로 계약을 정했습니다. 채점 문제에서 유효 입력이 보장된다면 이런 방어 검사는 제출 코드에서 간소화할 수 있습니다.

5. 시간 측정 전에 반복 횟수를 셉니다

계산 함수 solution은 N개를 한 번 방문하므로 O(N) 시간, 합계 변수는 O(1) 추가 공간입니다. 전체 프로그램은 원본 문자열, 토큰, 숫자 배열을 저장하므로 전체 공간을 O(1)이라고 쓰면 안 됩니다. 입력 문자열 길이를 L이라고 하면 파싱은 O(L), 계산은 O(N), 전체 저장은 O(L + N)으로 봅니다. 이 입력 계약처럼 정수 자릿수가 제한되면 보통 전체를 O(N)으로 요약할 수 있습니다.

중첩 반복문에서는 안쪽 범위까지 합해야 합니다. 모든 서로 다른 위치 쌍을 한 번씩 방문하면 N(N-1)/2회입니다. 아래 파일은 실행 속도의 초 단위를 재는 대신 실제 방문 횟수를 출력합니다. 따라서 컴퓨터 성능에 상관없이 입력 크기에 따른 증가를 비교할 수 있습니다.

파일: complexity.cjs

const assert = require('node:assert/strict');
function countVisits(n) {
  let linear = 0;
  let pairs = 0;
  for (let i = 0; i < n; i += 1) linear += 1;
  for (let i = 0; i < n; i += 1) {
    for (let j = i + 1; j < n; j += 1) pairs += 1;
  }
  return { n, linear, pairs };
}
for (const n of [0, 1, 10, 100]) {
  const result = countVisits(n);
  assert.equal(result.linear, n);
  assert.equal(result.pairs, n < 2 ? 0 : n * (n - 1) / 2);
  console.log(JSON.stringify(result));
}
node complexity.cjs
{"n":0,"linear":0,"pairs":0}
{"n":1,"linear":1,"pairs":0}
{"n":10,"linear":10,"pairs":45}
{"n":100,"linear":100,"pairs":4950}

N이 10에서 100으로 10배 늘 때 한 번 순회는 10에서 100회로 늘지만, 쌍 방문은 45에서 4950회로 늘어납니다. Big-O는 상수와 작은 항을 생략해 큰 입력에서의 증가 양상을 설명하므로 쌍 방문은 O(N²)입니다. 이 숫자가 특정 채점 제한의 통과 시간을 보장하지는 않습니다. 정렬, slice, 반복문 안의 includes처럼 숨어 있는 전체 순회도 함께 계산해야 합니다.

이제 세 수 중 최솟값으로 돌아가 보세요. 입력은 문자열에서 숫자로 바꾸지만 비교 대상은 항상 세 개라 계산은 O(1)이라는 점을 위의 N개 합계와 비교하면 됩니다. 디버깅할 때는 실행 실패, 파싱 실패, 계산 오답, 출력 형식 오류를 순서대로 나누어 확인하세요.

실행 장소를 고른 뒤 연산 증가를 비교합니다

표준 입력 없이 함수 한 개를 확인한다면 브라우저 개발자 도구 Console에서 입력 배열을 직접 전달할 수 있습니다. 파일 실행이나 채점기의 표준 입력 형식을 연습한다면 Node.js를 사용합니다. 문법이 같더라도 브라우저에는 Node의 파일 읽기 모듈이 없고, Node에는 페이지의 DOM이 기본으로 없으므로 실행 환경을 먼저 고릅니다. 준비 단계는 JavaScript 시작 가이드에서 확인하고, 계산 함수가 맞는지 확인한 뒤 입출력을 연결하세요.

실행 시간을 재기 전에 반복하는 연산 수를 셉니다. N개를 한 번 읽는 처리는 N회이고, 서로 다른 위치 쌍을 비교하면 N(N−1)/2회입니다. 입력이 열 배가 될 때 두 증가 양상은 다릅니다. 배열 끝 추가, 중간 삽입, 검색의 차이는 배열 연산 비용에서, 구조별 선택 기준은 자료구조 선택 가이드의 비용 비교에서 이어서 확인합니다. 반복문 안의 slice·includes나 정렬 비용까지 포함해야 하며, 계산 함수의 추가 공간과 입력 문자열·토큰 저장 공간도 나누어 셉니다.

이어서 공부할 개념

첨부 코드로 공부하기: 자료별 학습 위치

55개 코드 파일을 이름으로 찾아 관련 글에서 공부할 수 있습니다. 같은 이름의 파일도 압축 자료별로 구분했습니다. 공통 모듈은 실제 사용하는 자료구조와 연결하고, 테스트 파일은 호출 순서·반환값·상태 변화를 따라갑니다.

원본 예제와 글의 구현은 반환 규칙이나 빈 입력 처리가 다를 수 있습니다. 연결된 글의 원본 비교 설명을 먼저 읽고, 전체 코드와 실행 방법은 필요할 때 펼쳐 보세요.

첨부 자료별 55개 코드와 공부할 글 펼치기

외판원 문제.zip

코드 파일 공부할 글과 확인할 내용
algorithm/tsp(noDP).mjs 외판원 문제: 모든 방문 순서를 비교하고 출발점으로 돌아오기
모든 방문 순서를 비교하는 외판원 백트래킹과 출발점 복귀
algorithm/tsp.mjs 외판원 DP: 현재 도시와 방문 집합을 함께 저장하기
현재 도시와 방문 집합을 상태로 저장하는 외판원 DP

인터벌 스케쥴링.zip

코드 파일 공부할 글과 확인할 내용
algorithm/interval_scheduling.mjs 인터벌 스케줄링: 가장 먼저 끝나는 일정을 고르는 이유
종료 시간이 빠른 일정을 선택하는 인터벌 스케줄링

최대 유량 문제(포드 풀커슨 알고리즘).zip

코드 파일 공부할 글과 확인할 내용
graph/maximum_flow.mjs 포드 풀커슨 최대 유량: 잔여 용량과 역방향 간선으로 선택 수정하기
잔여 용량과 역방향 간선을 갱신하는 최대 유량

최소 신장 트리(프림 알고리즘).zip

코드 파일 공부할 글과 확인할 내용
algorithm/prim.mjs 프림 알고리즘: 최소 신장 트리와 연결되지 않은 그래프 처리
방문 집합에 가장 싼 간선을 더하는 프림 최소 신장 트리

탐욕알고리즘.zip

코드 파일 공부할 글과 확인할 내용
algorithm/coin_change.mjs 탐욕 알고리즘: 큰 동전 선택과 반례로 확인하는 최적성
큰 동전 선택의 과정과 탐욕 선택이 실패하는 반례

다익스트라알고리즘(업그레이드).zip

코드 파일 공부할 글과 확인할 내용
graph/dijkstra.mjs 다익스트라의 원리: 거리 완화와 오래된 후보 건너뛰기
거리 완화와 부모 기록을 이용한 최단 경로 복원

다익스트라알고리즘.zip

코드 파일 공부할 글과 확인할 내용
graph/dijkstra.mjs 다익스트라의 원리: 거리 완화와 오래된 후보 건너뛰기
미방문 정점의 거리 선택과 인접 간선 완화

가중그래프.zip

코드 파일 공부할 글과 확인할 내용
graph/weightedGraph.mjs JavaScript 그래프 구현: 인접 리스트·인접 행렬 비교와 BFS
정점별 이웃과 가중치를 저장하고 간선을 추가·제거하는 표현

깊이 우선 탐색 알고리즘.zip

코드 파일 공부할 글과 확인할 내용
graph/graph.mjs 그래프 DFS: 방문 표시로 순환을 멈추고 연결을 따라가기
들어갈 때 방문 표시하고 이웃 탐색 뒤 복귀하는 재귀 DFS

너비 우선 탐색 알고리즘.zip

코드 파일 공부할 글과 확인할 내용
graph/graph.mjs JavaScript 그래프 구현: 인접 리스트·인접 행렬 비교와 BFS
발견할 때 표시하고 큐에 예약하는 BFS 방문 순서

그래프.zip

코드 파일 공부할 글과 확인할 내용
graph/graph.mjs JavaScript 그래프 구현: 인접 리스트·인접 행렬 비교와 BFS
정점 객체와 인접 목록으로 이웃 연결을 추가·제거하기

우선순위 큐와 힙(우선순위 큐).zip

코드 파일 공부할 글과 확인할 내용
heap/heap.mjs JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
우선순위를 비교해 위아래로 복구하는 연결형 힙
heap/priorityQueue.mjs JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
힙으로 다음 우선 항목을 선택하고 노드·저장값 반환을 구분하기

힙정렬알고리즘.zip

코드 파일 공부할 글과 확인할 내용
heap/heapSort.mjs 제자리 힙 정렬: 배열 heapify와 확정 구간의 경계
별도 힙에 넣고 꺼내는 원본 정렬과 배열 안의 제자리 힙 정렬 구분

우선순위 큐와 힙(힙삽입과 제거).zip

코드 파일 공부할 글과 확인할 내용
heap/binaryTree.mjs JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
첨부 힙의 BinaryTree: 값과 연결을 나누어 읽기
heap/heap.mjs JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
연결형 최소 힙의 삽입·제거와 값 교환, 부모·자식 연결

Red-Black트리(제거).zip

코드 파일 공부할 글과 확인할 내용
redBlackTree/redBlackTree.mjs Red-Black 트리 삭제: LLRB 색 이동과 검은 높이 복구
적흑 트리 삭제의 색 복구와 LLRB 삭제 방식의 차이

Red-Black트리(삽입).zip

코드 파일 공부할 글과 확인할 내용
redBlackTree/binaryTree.mjs Red-Black 트리 삽입: LLRB 회전과 색 변환
색·부모·자식 연결을 저장하는 원본 노드와 LLRB 삽입의 표현 차이
redBlackTree/redBlackTree.mjs Red-Black 트리 삽입: LLRB 회전과 색 변환
적흑 트리 삽입의 회전·색 변환과 원본 부모·삼촌 분기 비교

AVL 트리(보조함수, 삽입, 제거).zip

코드 파일 공부할 글과 확인할 내용
avlTree/avlTree.mjs AVL 트리 삭제: 높이 갱신과 연속 균형 복구
AVL 삽입·삭제 중 높이를 갱신하고 삭제 뒤 균형을 복구하기
avlTree/binaryTree.mjs AVL 트리 삭제: 높이 갱신과 연속 균형 복구
노드의 좌우 연결과 height를 AVL 높이 갱신에 대응시키기

이진 탐색 트리 – 삽입과 검색.zip

코드 파일 공부할 글과 확인할 내용
binarySearchTree.mjs JavaScript 이진 탐색 트리 구현: 중복 키와 세 가지 삭제 처리
BST의 비교 방향, 빈 연결 삽입과 키 탐색

이진 탐색 트리 – 제거.zip

코드 파일 공부할 글과 확인할 내용
binaryTree.mjs JavaScript 이진 탐색 트리 구현: 중복 키와 세 가지 삭제 처리
첨부 BST의 BinaryTree: 연결 분리와 키 삭제의 차이
binarySearchTree.mjs JavaScript 이진 탐색 트리 구현: 중복 키와 세 가지 삭제 처리
세 가지 키 삭제와 원본 전임자·현재 후계자 계약 비교

이진 탐색 알고리즘.zip

코드 파일 공부할 글과 확인할 내용
binarySearch.mjs 이진 탐색의 불변식: 탐색 구간·중간값·종료 조건
첨부 재귀 이진 탐색: 인덱스 반환과 닫힌 구간 읽기

트리와 이진트리.zip

코드 파일 공부할 글과 확인할 내용
test_binaryTree.mjs 트리 자료구조 차이: 이진 트리 BST MST 구분하기
같은 이진 트리의 전위·중위·후위 순회와 자식 연결을 추적하기
binaryTree.mjs 트리 자료구조 차이: 이진 트리 BST MST 구분하기
값과 좌우 자식을 가진 이진 트리 노드와 세 가지 순회

dev.zip

코드 파일 공부할 글과 확인할 내용
dev/average.mjs 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신
평균: 합과 개수를 모은 뒤 마지막에 나눕니다
dev/average2.mjs 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신
평균: 합과 개수를 모은 뒤 마지막에 나눕니다
dev/bubble_sort.mjs 버블 정렬: 이웃 비교로 가장 큰 값을 뒤에 확정하기
이웃 비교를 반복하며 큰 값을 뒤에 확정하는 버블 정렬
dev/Deque.mjs JavaScript 원형 덱 구현: 양끝 삽입·삭제와 고정 용량 버퍼
연결 덱의 양끝 삽입·제거와 원형 배열 덱의 저장 방식 비교
dev/DoublyLinkedList.mjs 단방향 연결 리스트: head·tail 삽입과 삭제
prev·next 양방향 연결, 중간 삽입·삭제와 clear의 tail 참조 차이
dev/fibonacci.mjs DP 메모이제이션: 피보나치의 중복 호출 줄이기
한 파일의 순수 재귀·메모이제이션·테이블 피보나치를 비교하기
dev/fibonacci2.mjs DP 메모이제이션: 피보나치의 중복 호출 줄이기
피보나치 원본 비교: 실행시간보다 호출과 저장을 셉니다
dev/hanoi.mjs 하노이의 탑: 큰 원판 하나를 옮기기 위한 재귀적 순서
하노이 원판 이동의 기저 조건과 두 하위 호출 순서
dev/HashSet.mjs JavaScript Map·Set: 값 조회와 중복 제거 실습
해시 테이블로 중복 없는 집합과 포함·제거 연산 만들기
dev/HashTable.mjs JavaScript 문자열 해시 테이블 구현: 충돌 처리와 리사이즈, NFC 정규화
숫자 나머지 해시와 충돌 연결, 문자열 키 갱신 계약의 차이
dev/insertion_sort.mjs 삽입 정렬: 정렬된 앞부분에 다음 값을 끼워 넣기
정렬된 앞부분에 다음 값을 끼워 넣는 삽입 정렬
dev/length_of_str.mjs 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출
재귀 문자열 길이: 무엇을 한 글자로 셀지 먼저 정합니다
dev/LinkedList.mjs 단방향 연결 리스트: head·tail 삽입과 삭제
next 연결로 인덱스 삽입·삭제와 노드 반환을 이해하기
dev/merge_sort.mjs 병합 정렬: 작은 정렬 결과를 두 포인터로 합치기
나눈 구간을 두 포인터로 합치는 병합 정렬
dev/power.mjs 재귀의 종료 조건: 작은 문제와 기저 조건으로 거듭제곱 계산하기
지수를 줄여 기저 조건에 도달하는 재귀 거듭제곱
dev/Queue.mjs 큐와 FIFO: head 인덱스로 JavaScript 대기열 만들기
연결 큐의 뒤 삽입·앞 제거로 FIFO와 노드 반환을 확인하기
dev/quick_sort.mjs 퀵 정렬: 첫 피벗의 자리를 확정하고 양쪽을 정렬하기
첫 피벗을 분할하고 양쪽 구간을 재귀 정렬하기
dev/selection_sort.mjs 선택 정렬: 남은 구간의 최솟값으로 앞자리를 확정하기
남은 구간의 최솟값을 앞자리에 놓는 선택 정렬
dev/Stack.mjs 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기
연결 리스트의 한쪽 끝으로 push·pop·peek를 구현하기
dev/sum_of_array.mjs 재귀적으로 생각하기: 배열 합의 호출과 복귀를 따라가기
배열의 작은 합을 호출하고 돌아오며 더하는 재귀
dev/test.mjs 단방향 연결 리스트: head·tail 삽입과 삭제
첨부 test.mjs를 따라 인덱스·연결·반환 노드를 구분합니다
dev/test_deque.mjs JavaScript 원형 덱 구현: 양끝 삽입·삭제와 고정 용량 버퍼
첨부 test_deque.mjs의 양끝 시연과 원형 덱의 계약을 나눠 읽습니다
dev/test_hashtable.mjs JavaScript 문자열 해시 테이블 구현: 충돌 처리와 리사이즈, NFC 정규화
첨부 test_hashtable.mjs에서 충돌 후 조회·삭제의 결과를 읽습니다
dev/test_queue.mjs 큐와 FIFO: head 인덱스로 JavaScript 대기열 만들기
첨부 test_queue.mjs에서 연결 방향과 FIFO 반환 순서를 비교합니다
dev/test_set.mjs JavaScript Map·Set: 값 조회와 중복 제거 실습
첨부 test_set.mjs에서 중복·버킷 출력·반환값을 나눠 확인합니다
dev/test_stack.mjs 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기
첨부 test_stack.mjs에서 pop과 peek의 Node 반환을 추적합니다

fibonacci.mjs

코드 파일 공부할 글과 확인할 내용
fibonacci.mjs DP 메모이제이션: 피보나치의 중복 호출 줄이기
dev/fibonacci.mjs와 동일한 순수 재귀·메모·테이블 구현 비교

시작·완성 예제 파일

ZIP에는 시작본(starter), 완성본(complete), 실행 안내가 들어 있습니다. 압축을 푼 뒤 README의 준비 사항과 실행 순서를 확인하세요.

실습 ZIP 내려받기

글 소개·학습 준비·전체 목차
핵심 요약
코딩테스트는 익숙한 언어로 배열 순회와 상태 추적을 먼저 익힌 뒤, 값의 빈도·존재 확인은 Map, 최근 값의 역순 처리는 스택, 정렬·단조 조건이 있는 범위 축소는 투 포인터, 연속 구간의 재계산 제거는 슬라이딩 윈도우로 확장하는 순서가 효율적입니다.

공개 문제는 JavaScript·Python·Java·C++·C# 중 익숙한 언어로 직접 풀고 해답을 비교할 수 있습니다. 이 길잡이의 로컬 실행 예제는 JavaScript와 Node.js를 기준으로 합니다.

이 글은 자료구조 이름을 외우는 로드맵이 아니라 문제의 입력·필요한 상태·반복문의 불변식으로 도구를 선택하는 기준을 제공합니다. MDN과 ECMAScript 명세를 기준으로 Map의 성능 표현과 reduce 예외도 정확히 구분합니다.

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 익숙한 언어를 하나 고르고 입력·반환값·출력을 구분한 뒤 첫 문제를 시작하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.

다음 추천 · 알고리즘 개념: 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신

같은 주제에서 다음 개념과 예제로 이해를 넓힙니다.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 89개 · 필수 59개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기