[프로그래머스] 위장 Javascript

김아현·2022년 4월 23일
0

문제 보기

🔒 문제

🔐 해결 과정

  1. 경우의 수를 구하는 문제이므로 해시를 사용해서 푼다!
  2. 의상의 종류를 키로 같은 종류의 의상 수를 값으로 하는 해시 자료구조를 만든다.
  3. 모든 경우의 수 = (1번 의상 종류의 의상 수 + 1) (2번 의상 종류의 의상 수 + 1) ... (n번 의상 종류의 의상 수 + 1) 의 공식을 활용해 전체 경우의 수를 구한다.
    => 각 카테고리의 의상 수에 1을 더한 것은 아무것도 입지 않았을 경우를 뜻한다.
  4. (위 사진에선 잘렸지만) 스파이가 하루에 최소 하나의 옷은 입는다고 가정하고 있으므로 아무것도 입지 않는 경우를 빼주는 의미로 -1 한다.

🔓 풀이 (40m)

2022.04.23

function solution(clothes) {
    const closet = new Map();
    for(let i=0; i<clothes.length; i++){
        if(closet.has(clothes[i][1])){
            closet.set(clothes[i][1], closet.get(clothes[i][1])+1);
        } else {
            closet.set(clothes[i][1], 1);
        }
    }
    let result = 1;
    for(let v of closet.values()){
        result *= (v+1);
    }
    return result-1;
}

위 코드를 조금 줄여보면?

function solution(clothes) {
    let closet = new Map();
    for(let i=0; i<clothes.length; i++){
        closet.set(clothes[i][1], (closet.get(clothes[i][1]) || 0) + 1);
    }
    let result = 1;
    for(let v of closet.values()) {
        result *= (v+1);
    }
    return result-1;
}

🔁 feedback

경우의 수를 구할 때 해시를 사용하는 것을 알지 못했는데, 관련 개념을 검색해서 공식을 알고 푸니 이해가 됐다.
경우의 수 == 해시 !! (다른 좋은 방법이 있으면 댓글로 알려주세요 ,,)

+ 다른 사람의 풀이

✔️ reduce() 사용

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( ①reduce() ).reduce() ③ -1
①번에서 의상 종류별 의상 갯수를 카운트한 뒤 ②번에서 ①번으로부터 생성된 객체의 값들만 가져와 모든 경우의 수를 계산한다. ③번에서 아무것도 입지 않은 경우를 빼준다.

profile
Want to be backend developer

0개의 댓글