본문 바로가기

프로그래머스

6/16[문제풀이] 프로그래머스 Lv2 위장

출처 : https://programmers.co.kr/learn/courses/30/lessons/42578

[문제풀이]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function solution(clothes) {
    
    let count = 1;
    let obj = {}            
    
    clothes.forEach(function(element){
        
        if(obj[element[1]] >= 1) {
            
            obj[element[1]] += 1
            
        } else { 
            
            obj[element[1]] = 1
            
        }
        
    })
    
    for(let x in obj)        
        
        count *= (obj[x] + 1)
    
    return count - 1;
}
cs

 

의상을 하나만을 입는 것이 아닌 여러가지를 부위 별로 입을 수 있기에 obj라는 객체를 선언해서 사용하며 중복되는 키 값이 존재할 때는 count를 늘려주고 처음으로 생기는 것일 시에는 1로 초기화를 해준다. 그리고 객체에 담긴 값을 계산하는 식으로 구현했다.

 

문제의 요지가 의상별로 입을 수 있는 경우의 수를 구해는 것인데 유의해야 할 점이 무조건 하나는 입고 있어야 하고 부위별로 의상을 입는 것이 겹치지 않아야 한다는 것이다.

이를 식으로 나타내면 (1번 부위별 개수+1) * (2번 부위별 개수+1) * ... (n번 부위별 개수+1) - 1 이 되는데

여기서 +1은 해당 부위의상을 입지 않는 경우를 뜻하며 마지막에 -1인 경우는 아예 의상을 입지 않는 경우를 배제하기 위해 사용했다.

 

element[1]자체는 부위별 명칭이 될 것이다. 이런 식으로 구현하게 되면 객체 obj에 해당 부위별 key명칭이 존재한다면 count를 1씩 더하고 그렇지 않으면 1로 초기화한다는 것인데 그렇게 되면 최종적으로 나오는 결과 값은 중복없는 key명칭 값들이 count 되고 이를 마지막 for ~ in 문에 사용하여 앞서 말한 공식을 대입하여 값을 구하면 된다.