<내 풀이>
function solution(clothes) {
var answer = 1;
var obj = {};
for(var i=0; i < clothes.length; i++){
if(obj[clothes[i][1]] >= 1){
obj[clothes[i][1]] += 1; // 객체에 이미 같은 키값이 있다면 +1을 해준다.
}else{
obj[clothes[i][1]] = 1; // 새로운 종류의 옷(키값)이라면 1로 만든다.
}
}
for (var key in obj){
answer *= (obj[key]+1); // 각 옷 종류마다 안입는 경우를 포함
}
return answer - 1; // 전체 경우의 수에서 모두 안입는 경우 제외
}
이 문제에서 각 옷 종류마다 안 입는 경우가 있기에, +1씩 한 값들을 곱해주면 모든 경우의 수가 만들어진다.
여기서 answer-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;
} // reduce()의 초기값으로 빈 객체 {}를 설정해줌.
해석:
-
clothes.reduce(function,{}) 최초 값을 빈 객체로 생성하여 clothes를 순차적으로 키값(t [1]) 검색
-
undefined는 논리연산에서 false이므로 해당 키의 값이 undefined이면 해당 키값에 1을 넣어줌.
키의 값이 존재한다면 해당 값에 +1을 해줌.
-
이렇게 생성된 Key와 Value를 Object.values를 통해 값만 불러오도록 함.
-
reduce(function,1) 최초 값을 1로 설정하고 배열을 순차적으로 돌며 이전 값에 (해당 옷 종류의 개수)+1(옷을 입지 않은 경우)를 곱함.
-
모든 옷을 입지 않은 경우 제외 -1 후 return.
reduce() 함수
사용법 : arr.reduce(callback[, initialValue])
reduce()는 빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback 함수를 한 번씩 실행하는데, 콜백 함수는 다음의 네 인수를 받는다.
-
accumulator
-
currentValue
-
currentIndex
-
array
만약 reduce() 함수 호출에서 initialValue를 제공한 경우, accumulator는 initialValue와 같고 currentValue는 배열의 첫 번째 값과 같다. initialValue를 제공하지 않았다면, accumulator는 배열의 첫 번째 값과 같고 currentValue는 두 번째와 같다.
<출처>
<reduce 작동 방식 : 초기값을 설정 하지 않은 경우>
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
});
// 화살표 함수로 표현
[0, 1, 2, 3, 4].reduce( (prev, curr) => prev + curr );
콜백은 4번 호출된다. 각 호출의 인수와 반환값은 다음과 같다.
callback |
accumulator |
currentValue |
currentIndex |
array |
반환 값 |
1번째 호출 |
0 |
1 |
1 |
[0, 1, 2, 3, 4] |
1 |
2번째 호출 |
1 |
2 |
2 |
[0, 1, 2, 3, 4] |
3 |
3번째 호출 |
3 |
3 |
3 |
[0, 1, 2, 3, 4] |
6 |
4번째 호출 |
6 |
4 |
4 |
[0, 1, 2, 3, 4] |
10 |
reduce()가 반환하는 값으로는 마지막 콜백 호출의 반환 값(10)을 사용한다.
<reduce 작동 방식 : 초기값을 설정 해주는 경우>
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}, 10);
callback |
accumulator |
currentValue |
currentIndex |
array |
반환 값 |
1번째 호출 |
10 |
0 |
0 |
[0, 1, 2, 3, 4] |
10 |
2번째 호출 |
10 |
1 |
1 |
[0, 1, 2, 3, 4] |
11 |
3번째 호출 |
11 |
2 |
2 |
[0, 1, 2, 3, 4] |
13 |
4번째 호출 |
13 |
3 |
3 |
[0, 1, 2, 3, 4] |
16 |
5번째 호출 |
16 |
4 |
4 |
[0, 1, 2, 3, 4] |
20 |
reduce()가 결과로 반환하는 값은 20이다.
같은 배열에 대한 reduce() 사용이지만 초기값 설정 유무에 따라서 콜백 함수의 호출 수가 달라지고,
또 현재 값과 현재 값의 인덱스가 달라진다.
'알고리즘 문제풀기 > 프로그래머스' 카테고리의 다른 글
[JavaScript] 프로그래머스 - 다리를 지나는 트럭 (0) | 2020.05.11 |
---|---|
[JavaScript] 프로그래머스 - 모의고사 (0) | 2020.05.08 |
[JavaScript] 프로그래머스 - 가장 큰 수 (0) | 2020.05.07 |
[JavaScript] 프로그래머스 - K번째 수 (0) | 2020.05.06 |
[JavaScript] 프로그래머스 - 탑 (0) | 2020.05.06 |