의상

troubleshooting·3 min read·2026-07-31
목차

한 줄 요약

각 종류에서 “옷 하나를 고르거나 안 고르거나”는 (개수+1)가지, 종류별로 곱한 뒤 아무것도 안 입는 경우 1가지를 뺀다.

왜 (배경/문제 상황)

의상 — 종류별로 최대 1개씩만 착용 가능할 때, 서로 다른 옷 조합으로 만들 수 있는 경우의 수를 구하는 문제.

원인 분석 → 해결 방법

첫 시도부터 로직이 정확했다.

int solution(vector<vector<string>> clothes) {
    unordered_map<string, int> cnt;
    for (auto& c : clothes) {
        cnt[c[1]]++;
    }

    int answer = 1;
    for (auto& [type, num] : cnt) {
        answer *= (num + 1);
    }
    return answer - 1;
}

원래 코드는 return --answer;(전위 감소)를 썼는데, 결과값은 answer - 1과 동일하지만 --answer는 “answer 자체를 감소시킨다”는 부수효과가 있는 표현이라 읽는 사람이 한 번 더 생각하게 만든다. return answer - 1;이 의도를 더 명확히 드러낸다.

예제

옷이 3개인 종류가 있으면: “안 입음” 1가지 + “3개 중 하나 착용” 3가지 = 4가지(= 3 + 1). 종류가 여러 개면 각 종류의 경우의 수를 서로 곱한다 (종류별 선택은 독립적이므로). 마지막에 모든 종류에서 “안 입음”만 선택한 경우(아무것도 안 입음) 1가지를 빼준다.

주의사항

  • cnt[c[1]]처럼 unordered_map[]로 카운팅하는 패턴은 [완주하지 못한 선수]와 동일한 빈도수 세기 패턴이다.
  • --answer처럼 부수효과가 있는 표현은 동작은 맞아도 가독성을 해칠 수 있어, answer - 1처럼 명시적인 표현을 우선한다.

참고자료