[programmers] 위장(JS)

nRecode·2020년 9월 3일
0

Algorithm

목록 보기
2/48

문제

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

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

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

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

입출력 예

clothesreturn
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]]5
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]]3

접근

입력은 2차원 배열로 들어온다.
각 요소의 0번째 인덱스에는 이름 1번째 인덱스에는 종류가 들어온다.

  1. 같은 종류의 아이템은 중복으로 입을 수 없고 경우의 수를 return 하는 문제이기 때문에, 각 종류를 key로, 종류에 속하는 아이템의 갯수를 value로 가지는 객체를 생성한다.
  2. 첫번째 입출력 예시로 만들어지는 객체는 {headgear: 2, face: 1} 이와같이 만들어 질텐데... 이 스파이가 입을 수 있는 경우의 수는 [yellow_hat],[blue_sunglasses],[green_turban],[yellow_hat, blue_sunglasses],[green_turban, blue_sunglasses]로 총 다섯개가 return 되어야한다.
    이는 (headgear 수 + 1) * (eyewear 수 + 1) - 1 이 된다. 뒤의 -1은 아무것도 입지 않는 경우의 수를 제거한 것이다.
  3. 따라서 만들어진 객체의 value값들을 1씩 더해 모든 value를 곱한 뒤, -1를 해주는 방식을 사용한다.

풀이

function solution(clothes) {
    // 객체를 만드는 방법
    // {head: 2, face: 1} -> 5개 (2 + 1) * (1+1) - 1(옷을 입지 않은 경우);
    // {face: 3 } -> 3개  (3 + 1) - 1
    var answer = 1;
    
    let newObj = clothes.reduce((acc, val)=>{
        acc[val[1]] = acc[val[1]] + 1 || 1;
        return acc; // 이놈...
    },{});
    
    console.log(newObj);
    for(let i in newObj){
        answer *= (newObj[i] + 1);
    }
    return answer - 1;
}

reduce를 오랜만에 사용해봐서 그런지 return을 해야하는 것을 잊어서 헛발질했다 ㅜㅜ... 다행히 같이 스터디 해주시는 분이 알려주셔서 진행할 수 있었던 문제였다...!

끝 😀

profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글