본문 바로가기
코테연습

51. 위장 Javascript

by hxunz 2022. 5. 25.

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

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
    - 스파이가 옷을 겹치지 않게 몇번 조합해서 입을 수 있는지를 구하라.

  • 주어진 자료는 무엇인가?
     - 스파이의 의상이 담긴 2차원배열 clothes

  • 조건은 무엇인가?
     - 옷을 입을 때 의상 종류가 겹치면 안된다.
     - 최소 옷 하나는 입어야댐
     - 같은 이름을 가진 옷은 없다.


2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - 2차원 배열을 어떻게 다룰 수 있는가

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

 

const solution = (clothes) => {
    //2차원 배열을 의상종류를 기준으로해서 객체로 나타내자
    const objClothes = clothes.reduce((prev, row) => {
        const [clothe, kind] = row;
        prev[kind] = [...(prev[kind] || []), clothe];
        return prev;
    }, {});
    
    //객체 키가 하나일때는 그냥 바로 value 길이를 리턴
    if (Object.keys(objClothes).length === 1) {
        return Object.values(objClothes)[0].length;
    }

    //(a+1)(b+1)(c+1)
    //abc + ab + bc+ ac + a+ b+ c+1
    const result = Object.values(objClothes).reduce((acc, curr) => (curr.length+1)*acc, 1);
    
    return result - 1;
}

의상 종류를 기준으로 옷 이름을  알 수 있도록 (상의 : 노란색티셔츠 이런식으로) 나타내고 싶어서 

주어진 2차원 배열을 객체로 나타내주었다.

 

clothes라는 2차원 배열에 reduce를 적용한다. 초기값은 빈 객체.

const objClothes = clothes.reduce((prev, row) => {} ,{}};

row는 [옷종류, 옷이름] 이런식으로 나타내도록 변수를 만들었다.

const [clothe, kind] = row;

kind에 해당하는 key에 value를 넣어줄건데 prev[kind]에 이미 데이터가 존재하면 스프레드 연산자로 펼쳐주고

없다면 빈 배열을 펼쳐준다(아무것도 안넣어준다).

그 다음에 이걸 clothe에 담아준다.

prev[kind] = [...(prev[kind] || []), clothe];

 

 

그리고 주어진 입출력 예제를 봤는데 옷의 종류가 하나인 경우가 있었다.

그래서 객체의 key(옷의종류)가 하나인 경우는 그냥 value(옷이름)의 길이를 리턴해주었다.

if (Object.keys(objClothes).length === 1) {
return Object.values(objClothes)[0].length;
}

 

 

그 다음에 이제 스파이가 옷을 입을 수 있는 경우의 수를 구해야되는데 

예를 들어서,

상의: a, b, c , d(총4벌)
하의: e, f (총2벌)
안경: g, h (총2벌)

이렇게 주어진 경우, 경우의 수를 구해보면
상의&하의&안경 다 입는 경우 : 4x2x2
상의&하의 입는 경우: 4x2
하의&안경 : 4x2
상의&안경: 4x2
상의만 입는 경우: 4
하의 : 2
안경: 2

해서 다 더해주면 된다.
(4x2x2)+(4x2)+(4x2)+(4x2)+4+2+2

근데 수학 다항식 계산 공식으로 생각해보니까
(a+1)(b+1)(c+1)-1
= (abc + ab + bc+ ac + a+ b+ c+1) -1
하는거랑 똑같다.

그래서

(a+1)(b+1)(c+1)-1

이 공식을 적용해서 풀어보면

(a+1)(b+1)(c+1) 이 부분은

const result = Object.values(objClothes).reduce((acc, curr) => (curr.length+1)*acc, 1);

이렇게 나타낼 수 있고 

 

뒤에 -1을 해줘야하니까 

return result - 1;

 

'코테연습' 카테고리의 다른 글

53. 문자열압축 Javascript  (0) 2022.05.27
52. K번째수 Javascript  (0) 2022.05.25
50. 소수 만들기 javascript  (0) 2022.05.24
49. 완주하지 못한 선수  (0) 2022.05.24
48. 내적  (0) 2022.05.19

댓글