개발로그필름

[프로그래머스/js] 의상 본문

coding test/프로그래머스

[프로그래머스/js] 의상

yuullog 2024. 9. 4. 23:32
728x90
반응형
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=javascript

 

프로그래머스

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

programmers.co.kr

 

이 문제에서 핵심은 '조합'을 구하는 것

가진 의상들이 배열로 주어졌을 때 서로 다른 옷의 조합이 얼마나 있는지 알아보는게 먼저다

조합을 구해본지 오래되어서 처음에는 조금 헤맸지만? 주어진 배열의 조합을 구하다보니 어떤 규칙인지 눈에 보였다

처음 입출력의 예를 보자

[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]

 headgear에는 2가지, eyewear에는 1가지가 있다

총 조합의 수는 5가지

왜?

headgear1, headgear2, eyewear1, h1 e1, h2 e2  ==> 총 5가지

하지만 컴퓨터는 나처럼 매번 세서 구할 수 없는 멍텅구리이기 때문에 내가 이 과정을 일반화해서 수식으로 입력해주어야 한다^^

예전에 조합 배울때 곱하고 뺐던 기억이 스멀스멀 나기 시작해서 적용해본다

원래의 조합은 3가지 * 2가지 = 6가지이다 근데 왜 5가지냐?!

문제에서 한 개 이상의 옷은 입는다는 조건이 있으므로 아예 아무것도 안 입는 경우의 수는 빼야한다는 사실!

그래서 5가지가 나온것

그럼 이제 일반화한 수식을 만들어 낼 수 있겠지..?

 

자, 이제 코드를 작성해봅시돠

의상이 배열로 주어졌다는 점에서 key:value로 접근해서 문제를 풀기로 한다

 

현재 clothes 배열이 아래와 같이 주어지니까 종류별로 개수를 알고 싶다. 이게 이 문제의 핵심이니깐!

const clothes = [
  ["yellow_hat", "headgear"],
  ["blue_sunglasses", "eyewear"],
  ["green_turban", "headgear"]
];

 

그래서 {} 빈 객체를 선언하고 여기에 옷의 종류별 개수를 저장하려고 한다

const clothesMap = {};

clothes.forEach(item => {
	
	// item[0]은 옷 이름
    // item[1]은 옷 종류
    const type = item[1];
    
    if (clothesMap[type]) {
        clothesMap[type] += 1; // clothesMap에 있으면 +1
    } else {
        clothesMap[type] = 1; // 없으면 1
    }
});

이렇게 하면 clothesMap에 clothesMap = { headgear: 2, eyewear: 1 }; 이런식으로 저장이 되게 된다

 

이제 조합을 구해봅시다

let combinations = 1;  // 곱해야해서 1로 초기화

// 의상 종류별로 반복
for (const type in clothesMap) {   // type은 headgear나 eyewear같은 key
	// 앞서 조합 구할 때 옷 개수 + 입지 않는 경우 구했으니까 수식으로 아래와 같이 표현
	combinations *= (clothesMap[type] + 1); // 해당 종류의 옷 개수 + 입지 않는 경우(1)
}

// 아무것도 입지 않는 경우 하나를 빼줌
combinations -= 1;

 

최종 코드

function solution(clothes) {
    const clothesMap = {};
    
    clothes.forEach(item => {
        const type = item[1];
        if(clothesMap[type]) {
            clothesMap[type] += 1;
        } else {
            clothesMap[type] = 1;
        }
    })
    let combinations = 1;
    for(const type in clothesMap) {
        combinations *= (clothesMap[type]+1);
    }
    combinations -= 1;
    
    return combinations;
}

 

 

 

휴^^^^^^ 푸느라 한세월 걸렸네,,,,;;; 코딩테스트 언제 잘해,,,, 흑 ㅠㅠㅠㅠ

반응형
LIST
Comments