컬렉션 활용

컬렉션 활용

배열, Map, 사전을 활용한 문제 풀이 패턴

Map으로 빈도 카운팅

// 파일 중복 탐지: 파일명 → 등장 횟수
const map = new Map();
for (const filePath of param0) {
    const fileName = filePath.slice(filePath.lastIndexOf('/') + 1)
                             .replace(/_v[0-9]+/, "");  // 버전 제거
    map.set(fileName, (map.get(fileName) || 0) + 1);
}

// 2회 미만 제거
for (const [key, val] of map.entries()) {
    if (val < 2) map.delete(key);
}

패턴: map.get(key) || 0) + 1 → 키 없으면 0으로 초기화 후 증가


배열로 경로/상태 관리

윷놀이 말판처럼 이동 경로가 있는 경우:

// 이동 경로를 배열로 정의
const OUTER_SEQ = ['Z', 'A1', 'A2', ..., 'W', 'B1', ..., 'V', ..., 'Z'];

// 문자별 이동 거리를 사전으로 관리
const STEP_MAP = { '도': 1, '개': 2, '걸': 3, '윷': 4, '모': 5 };

// 분기점 처리를 맵으로 관리
const BRANCH_MAP = { 'W': 'SHORTCUT_W', 'V': 'SHORTCUT_V' };

핵심: 하드코딩/비교문 최소화 → 데이터를 사전/맵으로 추출


Map으로 참가자 상태 추적

// 참가자별 점수 Map
const demerit = new Map([['A', 0], ['B', 0], ['C', 0]]);

// 카드 내려놓기
const downCardMap = new Map([['A', 0], ['B', 0], ['C', 0]]);

// Map → 배열로 변환 후 정렬
const sorted = [...downCardMap.entries()]
    .sort(([, a], [, b]) => a - b);  // 카드값 오름차순

// 정렬된 순서로 처리 (작은 카드부터)
for (const [player, card] of sorted) {
    process(player, card);
}

자주 쓰는 Map 패턴 모음

// 1. 빈도 카운팅
map.set(key, (map.get(key) || 0) + 1);

// 2. 그룹핑 (key → 배열)
if (!map.has(key)) map.set(key, []);
map.get(key).push(value);

// 3. Map → 정렬된 배열
[...map.entries()].sort(([, a], [, b]) => a - b);

// 4. 조건 필터링
for (const [key, val] of map.entries()) {
    if (조건) map.delete(key);
}

// 5. Map → 배열 변환
const keys = [...map.keys()];
const values = [...map.values()];
const entries = [...map.entries()];

문제 설계 시 체크리스트

입력 검증 (방어적 코드)

// 입력 타입 검사
if (!Array.isArray(param0)) throw new Error("배열이어야 합니다.");

// 크기 제한
if (param0.length > 100) throw new Error("100개 이하여야 합니다.");

// 대소문자 정규화
const normalized = input.toLowerCase();

// 허용 문자 패턴
const valid = /^[a-z0-9\/._]+$/.test(normalized);

문제 풀이 공통 실수

실수 해결
처리 순서 고정 (A→B→C) 정렬 후 처리 (값 기준 정렬 → 순서 결정)
변수명 중복 선언 (중첩 블록) 의미 있는 변수명으로 구분
종료 조건 누락 코딩 전 주석으로 판단 조건 전체 정리
파싱 전 검증 파싱 → 변환 → 검증 순서 지키기

관련 개념