[프로그래머스 lev2/JS] 위장

woolee의 기록보관소·2022년 10월 27일
0

알고리즘 문제풀이

목록 보기
23/178

문제 출처

프로그래머스 lev2 - 위장

문제

나의 풀이

실패..!

1개씩 입는 것과 1개 이상 조합해서 입는 걸 나눈 게 화근이었다. 덕분에 혼자 엄청 꼬였다. 종류 개수에 따라 경우의 수가 확확 달라질 수 있다고 생각했다. 재귀를 연습해보고 싶어서 되지도 않는 삽질을 했다.

애초에 객체로 변환할 때, 옷을 1가지만 입는 경우를 고려해서
false면 0+1이 아니라 1+1로 넣었어야 한다.

/* 틀린 풀이 ... */
function solution(clothes) {
  let obj = {};
  for (let i=0; i<clothes.length; i++) {
    if (obj[clothes[i][1]]) obj[clothes[i][1]]++;
    else obj[clothes[i][1]]=1;
  }

  let answer=1;
  if ((Object.keys(obj).length == 1)) {
    answer=clothes.length;
  }

  else if (Object.keys(obj).length == 2) {
    for (let i=0; i<Object.keys(obj).length; i++) {
      answer = answer * Object.values(obj)[i];
    }
    answer = answer + clothes.length;
  }

  else if (Object.keys(obj).length > 2) {
    answer=0;
    let val = [...Object.values(obj)];

    let tmp = [];
    let ch = Array.from({length:val.length}, () => 0);
    let ans=1;
  
    for (let k=2; k<Object.keys(obj).length; k++) {
      function cb (L,s) {
        if (L==k) {
          for (let j=0; j<tmp.length; j++) {
            ans=ans*tmp[j];
          }
          answer += ans*1;
        }
        else {
          for (let i=s; i<val.length; i++) {
            if (ch[i]==0) {
              tmp[L]=val[i]
              ch[i]=1;
              cb(L+1, i+1);
              ch[i]=0;
            }
          }
        }
      }
      cb(0,0)
    }
    answer = answer + clothes.length;
  
  } 
  return answer; 
}

console.log(solution(
  [["yellow_hat", "head"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]))

다른 풀이 (통과 코드)

아주 단순하게 객체로 변환 -> values를 곱해준 뒤,
최소 1가지 옷을 입으므로 옷을 입지 않는 경우를 -1 해주면 되는 방식.

function solution(clothes) {
  var answer = 1;
  var obj={};
  for(let i=0;i<clothes.length;i++){
      obj[clothes[i][1]]=(obj[clothes[i][1]] || 1) + 1;
  }

  for(let key in obj){
      answer *= obj[key];
  }
  
  return answer-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;    
}
profile
https://medium.com/@wooleejaan

0개의 댓글