본문 바로가기

Web/Algorithm

[ 프로그래머스 > 해시] 위장

 

내 통과 코드

function solution(clothes) {
    let answer = 0;
    let closet = clothes.reduce((prev,now) =>  ({ ...prev, [now[1]]: (prev[now[1]] || 0) + 1 }),{});

    let key = Object.keys(closet).length-1;
    let res = 1;

    while (key >= 0) {
        res *= closet[Object.keys(closet)[key]]+1
        key--;
    }
    return answer = res - 1, answer;
}

 

종류 -  모자:[빨강, 검정] , 상의:[긴팔, 민소매] , 하의:[미디스커트, 슬랙스, 숏팬츠] 라고 한다면 


모자의 종류 2가지 상의의 종류 2가지 하의의 종류3가지 라고 한다면

모자에서 나올 수 있는 경우의 수 - 빨강 착용/ 검정 착용/ 미착용 (3가지)

상의에서 나올 수 있는 경우의 수 - 긴팔 착용/ 민소매 착용/ 미착용 (3가지)

하의에서 나올 수 있는 경우의 수 - 미디 착용/ 슬랙스 착용/ 숏팬츠 착용 /미착용 (4가지)

따라서, 3 x 3 x 4 = 36 인데, 반드시 하나 이상을 착용한다고 했으므로 모두 미착용인 경우 1을 빼줘야 한다.

그럼 35가 되는데 위에서 한 말을 식으로 표현하면

(모자 갯수+1)(상의+1)(하의+1)-1 ===> 종류로 갯수에 접근 할 수 있도록 객체로 변환해 주고 구했다. 


좋아요 가장 많은 다른 사람의 풀이

function solution(clothes) {
    return Object.values(clothes.reduce((obj, t)=> {
        obj[t[1]] = obj[t[1]] ? obj[t[1]] + 1 : 1;
        return obj;
    } , {})).reduce((a,b)=> a*(b+1), 1)-1;    
}

 

Object.values() 가 객체의 key에 대한 값들만 배열로 만든 뒤 반환해 준다고 한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/values

 

Object.values()

Object.values() 메소드는 전달된 파라미터 객체가 가지는 (열거 가능한) 속성의 값들로 이루어진 배열을 리턴합니다. 이 배열은 for...in 구문과 동일한 순서를 가집니다. (for in 반복문은 프로토타입 체인 또한 열거한다는 점에서 차이가 있습니다.)

developer.mozilla.org