[코테] 의상 (해시)

ekil·2026년 3월 26일

코딩테스트

목록 보기
1/9

의상 (해시)

2026.3.26.

https://school.programmers.co.kr/learn/courses/30/lessons/42578

핵심 개념

각 카테고리의 아이템마다 "선택함 / 선택하지 않음" 두 가지 경우의 수
-> (카테고리별 아이템 수 + 1)을 전부 곱하고, 아무것도 안입은 것은 제외하기 위해 -1

내 풀이

function solution(clothes) {
    const map = new Map();
    
    for (let cloth of clothes) {
        if (!map.has(cloth[1])) {
            map.set(cloth[1], [cloth[0]]);
        } else {
            const arr = map.get(cloth[1]);
            map.set(cloth[1], [...arr, cloth[0]])
        }
    }
    
    const arr = Array.from(map.values());
    
    const answer = arr.reduce((acc, cur) => {
        const available = cur.length + 1;
        return acc * available;
    }, 1) - 1;
    
    return answer;
}

개선된 풀이

function solution(clothes) {
    const map = new Map();
    
    for (let cloth of clothes) {
        map.set(cloth[1], (map.get(cloth[1]) || 0) + 1);
    }
    
    const answer = [...map.values()].reduce((acc, cur) => acc * (cur + 1), 1) - 1;
    return answer;
}

핵심 차이

아이템 이름은 사용하지 않고, 타입별 아이템 개수만 필요하므로, 개수만 저장하도록 구현 = 로직이 단순해짐

막혔던 포인트

  • 경우의 수를 구할 개념을 잡지 못했음 ('선택함 / 선택안함' 두 경우뿐이라는 사실)
  • 2차원 배열을 어떻게 재구성할지 몰랐음

풀면서 찾은 개념

  • 내가 원했던 자료 구조는 Set이 아닌 Map이었음. has, get, set 메서드가 존재하는 자료 구조!
  • for ... in 이 아닌, for ... of 를 써야 함
  • reduce 함수 파라미터는 acc, cur 순서이고, 화살표 함수로 작성하지 않았으면 return 잊지 말고, 초기값 설정 잊지말자. 이 문제는 '곱하기'를 해야 하는데, 초기값을 관성적으로 0으로 설정했다가 계속 -1이 출력되는 해프닝이 있었음.

다음에 비슷한 문제 만나면

  • 카테고리별 그룹화가 필요하면 Map 먼저 떠올리기
  • 경우의 수 조합 문제면 '선택 / 미선택' 관점으로 접근해보기
profile
좋아하는 일을 잘함으로써 먹고살고 싶은 프론트엔드 개발자입니다.

0개의 댓글