[JavaScript][Programmers] 위장

조준형·2021년 7월 2일
0

Algorithm

목록 보기
7/142
post-thumbnail

🔎 위장

❓ 문제링크

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

📄 제출 코드

function solution(clothes) {
    let answer = 1;
    let result = {};
    for (var i = 0; i < clothes.length; i++) {
        result[clothes[i][1]] = (result[clothes[i][1]] || 1) + 1;
        // console.log(result[clothes[i][1]])
    }
    // console.log(result);
    for (var key in result) {
        answer *= result[key];
    }
    return answer - 1;
}

입력이
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]
이렇게 들어오는데

result[clothes[i][1]] = (result[clothes[i][1]] || 1) + 1;

이 때 뒤에오는 타입들을 key값으로 같은게 오게되면 +1을함.
해당 key가 없으면 1, 있으면 해당key의 값에 +1.
처음 1에다가 +1하는 이유는 고를 때 없는 경우를 생각한 것.
없는경우 까지 생각했기 때문에 마지막에는 전부 안 입는 경우가 생기기 때문에 answer에 -1을 해줌.

result값
{ headgear: 3, eyewear: 2 }
headegear : yellow, green, X
eyewear : blue, X

yellow, blue / yellow,x / green, blue / green, X / X, blue / X, X
이렇게 6가지.
마지막에 선택하지 않는 경우 -1.

🎲 리팩토링

📄 초기 코드


function solution(clothes) {
    let result = {}

    for (var i = 0; i < clothes.length; i++) {
        [name, type] = clothes[i];
        result[i] = {
            type,
            name,
        }
    }
    let resArr = Object.entries(result);

    let answer = 0;
    for (let i = 1; i <= resArr.length; i++) {
        dfs(resArr, 0, [], i)
        answer += answers.length
        answers.splice(0);
    }
    return answer;
}

let answers = [];
let typeArr = new Set();
function dfs(nums, num, arr, tlen) {
    if (num == tlen) return answers.push([...arr]);
    else {
        for (let i = 0; i < nums.length; i++) {
            if (typeArr.has(nums[i][1].type)) continue;
            else {
                typeArr.add(nums[i][1].type);
                arr.push(nums[i])
                dfs(nums.slice(i + 1), num + 1, arr, tlen)
                typeArr.delete(nums[i][1].type);
                arr.pop()
            }
        }
    }
}

객체에 인덱스별로 타입과 key를 저장하여 객체안의 값들로 조합을 찾아 저장하고, 그 조합이 들은 answers의 길이를 답으로 출력하려 하였음.
그러나 제출 시 5개 테스트 케이스에서 시간초과 발생.
그래서 다른 방법을 찾다가 수학적으로 접근하여 간단하게 풀 수 있는 문제였음.

profile
깃허브 : github.com/JuneHyung

0개의 댓글