본문 바로가기
기초다지기/JS 코딩테스트

javaScript 2차원 배열 중복 계산 문제

by 김빵그 2024. 1. 12.

문제 

각 의상 종류별로 최대 1가지 의상만 착용할 수 있고, 서로 다른 옷의 조합을 할 때 주어진 의상 목록으로 매일 다른 스타일을 즐기려면 몇 가지 방법이 있을지 구하여라

풀이 

function solution(clothes) {
  var answer = 1;
  var categories = {};

  clothes.forEach((cloth) => {
    var category = cloth[1];
      console.log(category)
    categories[category] = (categories[category] || 0) + 1;
  });

  Object.values(categories).forEach((count) => {
    answer *= count + 1;
  });

  return answer - 1;
}
  • category cloth[1]
    • cloth 배열의 구조가 [의상이름, 의상종류] 순서로 되어 있다. category cloth[1]은 의상 종류를 뜻함 
  • categories[category]
    • categories[category] 현재 의상 종류 (category)에 해당하는 개수를 가져온다 
    • || 0 만약 해당 의상 종류에 대한 개수가 존재하지 않으면 (undifined 또는 false) 면 0으로 대체
    • 아니면 +1 
    • 다시 categories 객체에 저장
  • Object ...
    • 각 의상 종류별로 (해당 의상을 입지 않을 경우도 포함?) 입을 수 있는 경우의 수 계산 
    • 해당 의상을 입지 않을 경우 포함하기 위해 +1 
    • 모든 의상을 입지 않을 경우는 제외 answer --;

 

다른 풀이

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 
    • 의상 배열을 순회하고 의상 종류별로 개수를 센다
    • obj[t[1]] 현재 의상 종류 t[1]에 대한 개수를 나타냄 해당 종류가 이전에도 등장했다면 1 초기화 아니면 개수 1 증가
  • values 
    • 객체값을 배열로 가져옴
  • reduce 
    • a는 현재까지의 총 경우의 수를 나타냄 b는 각 의상 종류별로 ㄴ개수를 나타냄 
    • a * (b + 1)은 해당 의상 종류를 입지 않을 경우 포함한 경우의 수를 곱 
    • -1 해서 모든 의산 입지 않는 경우 제외 
function solution(clothes) {
    const types = {};
    for(const [style, type] of clothes){
        if(type in types) types[type] +=1;
        else types[type] = 1;
    }
    let sum = 1;
    for(const type in types) sum *= (types[type] + 1)
    return sum -1;
}

'기초다지기 > JS 코딩테스트' 카테고리의 다른 글

javaScript 과일 장수  (0) 2024.01.18
javaScript 캐시 계산  (0) 2024.01.15
javaScript 2차원 배열 자르기 문제  (1) 2024.01.11
javaScript 분수 덧셈  (1) 2024.01.10
javaScript 연속된 정수의 합  (1) 2024.01.09