본문 바로가기

알고리즘

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

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[리팩토링 전 최초 코드] : 통과

function solution(clothes){
  let temp = []
  let clothesArr=Array.from(new Set(clothes.map((item)=>item[1]))).map((item)=>[item])
  let answer=1;

  
  for(i=0;i<clothes.length;i++){
    for(j=0;j<clothesArr.length;j++){
      if(clothes[i][1]===clothesArr[j][0]){
        clothesArr[j].push([clothes[i][0]])
        break
      }
    }
  }

  for(i=0;i<clothesArr.length;i++){
    answer=answer*clothesArr[i].length
  }

  return answer-1
}

[리팩토링 후 최종 코드] : 통과

function solution(clothes) {
    
  let clothesArr = [];

  for (let i = 0; i < clothes.length; i++) {
    let type = clothes[i][1]; //headgear, eyewear 
    let existingType = clothesArr.find(item => item.type === type); // 이미 존재하는지 확인

    if (!existingType) {
      clothesArr.push({
        type: type,
        items: [clothes[i][0]]
      });
    }// 없다면 {type:"headgear",items:["yellow_hat"]} 과 같은 형식으로 추가

    else {
      existingType.items.push(clothes[i][0]);
        // 없다면 {type:"headgear",items:["yellow_hat","blue_sunglasses"]} 과 같은 형식으로 추가
    }
  }

 // 조합의 수는 각 타입들이 보유한 item의 개수들의 곱
  let total = 1;
  for (let i = 0; i < clothesArr.length; i++) {
    total *= clothesArr[i].items.length + 1;
  }

  // 하나도 입지 않은 경우는 제외
  return total - 1;
}

예전에 해시 관련해서 한 번 공부한 적이 있었는데, 원하는 방식으로 정확하게 구현을 하지는 못해서 차선택으로 배열을 통해 구현을 하여 정답을 구하였다. 원하는 형식으로 만든 뒤에 전체 조합의 개수를 구하는 방법은 쉬웠다. 

728x90