프로그래머스 - 의상

Lellow_Mellow·2023년 4월 30일
0
post-thumbnail

✨ Lv. 2 - 의상

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42578

문제 설명

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트
  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.

코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.


제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

풀이 코드 + 설명

우선 단순히 옷을 어떻게 조합하여 입을 수 있는지에 대해 생각해보았습니다. 입력에서 같은 이름을 가진 의상은 존재하지 않는다는 조건이 있으므로, 옷의 카테고리 별 가짓수로 생각해봅시다.

만약 얼굴에 A, B라는 2종류가 있다고 가정한다면, 얼굴에 의상을 착용하는 가짓수는 A, B, 입지 않음으로 총 3가지일 것입니다. 그렇다면 단순하게 얼굴에 2종류, 상의 1종류가 존재한다고 하면 선택할 수 있는 가짓수는 어떻게 될까요?

  1. 얼굴 : A / 상의 : A
  2. 얼굴 : B / 상의 : A
  3. 얼굴 : A / 상의 : 안입음
  4. 얼굴 : B / 상의 : 안입음
  5. 얼굴 : 안입음 / 상의 : A
    얼굴 : 안입음 / 상의 : 안입음

단순히 생각한다면 3 x 2로 6가지라 생각할 수 있지만, 의상 중 적어도 하나는 착용해야하기 때문에 전부 입지 않는 경우의 수인 1을 제외해야 합니다.

그렇다면 이를 코드로 구현해보겠습니다. 빈 객체를 만든 후, clothes를 순회하며 index 1에 있는 옷의 종류별로 가짓수를 저장합니다. 이후, 해당 객체를 순회하며 각 가짓수에 1을 더한 값을 모두 곱한 값을 구한 이후, 여기에 전부 입지 않는 경우의 수인 1을 빼내어 결과를 도출합니다.

function solution(clothes) {
    let category = {};
    let result = 1;
    clothes.forEach((v) => category[v[1]] = (category[v[1]] || 0) + 1);
    for(let v in category) result *= (category[v] + 1);
    return result - 1;
}

profile
잔잔한 물결에서 파도로, 도약을 위한 도전. 함께하는 성장

1개의 댓글

comment-user-thumbnail
2023년 9월 9일

감사합니다 :)

답글 달기